獨立遊戲夢斷三國筆記——Unity3d實現類似RPGMAKER行走圖

最近想在《夢斷三國》裡面加入橫版動作元素(別問我為啥一個策略遊戲要有橫版動作。。。)

於是開工

結果一開搞就懵逼

unity3d的動作切換是一個叫做animator的東東

需要你把每個動作動畫先做出來

然後把每個動畫放入一個controler的東東里

再在代碼里切換

比如最簡單的

上下左右走,攻擊

要做12套動畫,然後給每套動畫起一個美美的名字

然後在腳本里調用。。。

然後我如果要做其他人的動畫(比如說5虎吧)

就要做12x5套動畫,然後給每個動畫起一個美美的名字(當然這些名字可以重名的。。。)

然後再在腳本里調用。。。

我勒個去。。。要我死啊,這要是做108將還得了

RPGMAKER里的行走圖直接一換一個人多好。。。

於是我查了半天。。。發現好像很少有具體的代碼。。。只好自己實現了。。。

兩個類

demo行走圖就決定是你了

首先寫一個單件全局類把這玩意導入(沒錯我就是單件模式狂魔。。。)

using UnityEngine;

using System.Collections;

using UnityEngine.UI;

using UnityEngine.SceneManagement;

public class Global_source_loader

{

public Texture2D [] WalkSprites=new Texture2D[500];//行走圖數組

public Texture2D [] AttackSprites=new Texture2D[500];//攻擊圖數組

private static Global_source_loader instance = new Global_source_loader();

private Global_source_loader ()

{

WalkSprites[0]=(Texture2D)Resources.Load("guanyu");//載入關羽哥哥的圖片

AttackSprites[0]=(Texture2D)Resources.Load("guanyu_melee");//載入關羽哥哥的攻擊圖片

}

public static Global_source_loader getInstance()

{

return instance;

}

}

///////////////////////////////////

//////////掛在在角色obj身上的腳本

/////////////////////////////////

using UnityEngine;

using System.Collections;

public class spiritecontrol : MonoBehaviour {

Animator animator;

const float kDuration = 1.6f;//1.6f;// 1.7f;

bool init = false;

enum STATUE{UP,RIGHT,LEFT,DOWN};

int nowstatue=(int)STATUE.DOWN;

//const float frameRate = 30f;

Sprite [] SlicesList=new Sprite[16];

Sprite [] AttackSlicesList=new Sprite[16];

Sprite [] NowSlicesList=new Sprite[16];

SpriteRenderer spr;

int m_CurSlice = 0;

int updateTime=0;

// Use this for initialization

void Start () {

init = true;

spr = gameObject.GetComponent<SpriteRenderer>();

InitSlicesList();

}

void InitSlicesList()

{

for (int i = 0; i < SlicesList.Length; i++) {

Texture2D WalkSpritetemp=Global_source_loader.getInstance().WalkSprites[0];

SlicesList[i]=Sprite.Create(WalkSpritetemp,new Rect(i%4*WalkSpritetemp.width/4,i/4*WalkSpritetemp.height/4,WalkSpritetemp.width/4,WalkSpritetemp.height/4),new Vector2(0.5f,0.5f));

}

for (int i = 0; i < SlicesList.Length; i++) {

Texture2D AttackSpritetemp=Global_source_loader.getInstance().AttackSprites[0];

AttackSlicesList[i]=Sprite.Create(AttackSpritetemp,new Rect(i%4*AttackSpritetemp.width/4,i/4*AttackSpritetemp.height/4,AttackSpritetemp.width/4,AttackSpritetemp.height/4),new Vector2(0.5f,0.5f));

}

NowSlicesList = SlicesList;

}

// Update is called once per frame

void FixedUpdate () {

if ( !init) {

Start();

}

if (Input.GetKey(KeyCode.LeftArrow)) {

nowstatue=(int)STATUE.RIGHT*4;

}

if (Input.GetKey(KeyCode.RightArrow)) {

nowstatue=(int)STATUE.RIGHT*4;

}

if (Input.GetKey(KeyCode.UpArrow)) {

nowstatue=(int)STATUE.UP*4;

}

if (Input.GetKey(KeyCode.DownArrow)) {

nowstatue=(int)STATUE.DOWN*4;

}

if (true==Input.GetKey(KeyCode.D)) {

NowSlicesList = AttackSlicesList;

}

else if(false==Input.GetKeyUp(KeyCode.D)) {

NowSlicesList = SlicesList;

}

UpdateAnim ();

}

void UpdateAnim ()

{

if (10 == updateTime++) {

spr.sprite = NowSlicesList[nowstatue+m_CurSlice];

m_CurSlice++;

if (m_CurSlice>=4) {

m_CurSlice = 0;

}

updateTime = 0;

}

}

}

其實思路也很簡單,就是根據當前按鍵,判斷動作,然後根據動作找到當前動作在圖片中的起點,然後在刷新的時候更新下一個圖片,更新到頭之後回到起點

媽媽再也不擔心我的動畫了

說實話unity很多組件真是把你往坑裡帶啊。。。要是按照原生流程來,豈不是要搞半天。。。(其實這代碼我也寫了半天。。。)

最後效果如圖所示。。。關羽的龜派氣功。。。

當然這個類還不是最終版,為了能夠讓這個掛載類通用化,可以直接通過名字載入不同spirite,還需要加點變數什麼的,不過明天再搞了,有興趣的可以自己改改看怎樣才能讓這個類方便的變更為使用其他spirite資源

就這樣吧,休息,休息一會兒


推薦閱讀:

TAG:Unity遊戲引擎 | 獨立遊戲 | 計算機技術 |