獨立遊戲夢斷三國筆記——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資源
就這樣吧,休息,休息一會兒
推薦閱讀: