回合制自己写的
战斗DEMO 加动画状态
Q键移动并攻击。
代码很简单。不要抱有太大希望 。作为新手学习使用。
public enum HeroStatus
{
idle = 0, //空闲
attack, //攻击
other, //其他
hit, //受击
die, //死亡
defense, //防御
cast, //施法
miss, //闪避
seriousInjury, //重伤
move, //移动
exit, //获取下一个状态
MAX,
}
public class hero : MonoBehaviour {
public UISpriteAnimation m_spriteAnimation = null;
public HeroStatus m_staus = HeroStatus.exit;
//身体碰撞盒
public BoxCollider m_bodyBC = null;
public string m_name = "";
public AttackCrash m_attackCrash = null;
public byte m_posIndex = 0;
void Awake()
{
m_spriteAnimation = transform.GetComponent
();
m_bodyBC = transform.GetComponent();
}
// Use this for initialization
void Start () {
m_spriteAnimation.AddFrameCallBack("attack", 1, AttackCallBack);
m_spriteAnimation.AddFrameCallBack("attack", 4, AttackCallBack);
m_spriteAnimation.AddFrameCallBack("attack", 7, AttackCallBack);
}
public float m_speed = 1f;
public float m_offset = 0.5f;
public Vector3 m_destination = Vector3.zero;
public List m_actionList = new List();
// Update is called once per frame
void Update ()
{
switch (m_staus)
{
case HeroStatus.idle:
//空闲状态
if (m_actionList.Count > 0)
m_staus = HeroStatus.exit;
break;
case HeroStatus.attack:
if (!m_spriteAnimation.isPlaying)
{
//攻击动画播放完毕
m_staus = HeroStatus.exit;
}
break;
case HeroStatus.defense:
transform.position = Vector3.MoveTowards(transform.position, m_destination, m_speed * Time.deltaTime);
if (transform.position == m_destination)
m_staus = HeroStatus.exit;
break;
case HeroStatus.hit:
transform.position = Vector3.MoveTowards(transform.position, m_destination, m_speed * Time.deltaTime);
if (transform.position == m_destination)
m_staus = HeroStatus.exit;
break;
case HeroStatus.die:
break;
case HeroStatus.cast:
break;
case HeroStatus.miss:
break;
case HeroStatus.seriousInjury:
break;
case HeroStatus.move:
transform.position = Vector3.MoveTowards(transform.position, m_destination, m_speed * Time.deltaTime);
if (transform.position == m_destination)
m_staus = HeroStatus.exit;
break;
case HeroStatus.exit:
//获取下一个状态
if (m_actionList.Count > 0)
{
string str = "idle";
switch(m_actionList[0].status)
{
case HeroStatus.move:
str = "idle";
break;
default:
str = Enum.GetName(typeof(HeroStatus), m_actionList[0].status);
break;
}
m_spriteAnimation.namePrefix = str;
m_spriteAnimation.loop = m_actionList[0].loop;
m_destination = m_actionList[0].destinationMove;
m_speed = m_actionList[0].speed;
m_spriteAnimation.ResetToBeginning();
m_staus = m_actionList[0].status;
m_actionList.RemoveAt(0);
}
else
{
m_spriteAnimation.namePrefix = Enum.GetName(typeof(HeroStatus), HeroStatus.idle);
m_spriteAnimation.loop = true;
m_spriteAnimation.ResetToBeginning();
m_staus = HeroStatus.idle;
}
break;
// case HeroStatus.moveback:
// //transform.position = Vector3.SmoothDamp(transform.position, destinationMove, ref cameraVelocity, smoothTime);
// transform.position = Vector3.MoveTowards(transform.position, destinationMove, m_speed * Time.deltaTime);
// if (transform.position == destinationMove)
// m_staus = HeroStatus.idle;
// break;
}
}
public void SetPosition(byte pos, float x, float y)
{
m_posIndex = pos;
transform.localPosition = new Vector3(x, y);
}
public void AttackCallBack()
{
//创建攻击特效 A攻击B B掉血222 B反击A闪避
UnityEngine.Object sourceObj = Resources.Load("AttackCrash");
GameObject go = UnityEngine.Object.Instantiate(sourceObj) as GameObject;
go.transform.parent = transform;
go.transform.localScale = Vector3.one;
go.transform.localPosition = new Vector3(-70, 0, 0);
}
private void OnCollisionEnter(Collision co)
{
//进入碰撞
Debug.Log("进入碰撞!");
UnityEngine.Object sourceObj = Resources.Load("Effect");
GameObject go = UnityEngine.Object.Instantiate(sourceObj) as GameObject;
go.transform.parent = transform;
go.transform.localScale = Vector3.one;
go.transform.localPosition = new Vector3(0, 0, 0);
//Defense();
Hit();
}
public void Attack(GameObject aims)
{
ActionData tmpAD = new ActionData();
tmpAD.status = HeroStatus.move;
tmpAD.loop = true;
UISprite tmpS = transform.GetComponent();
tmpAD.destinationMove = GameObject.Find("UI Root/Camera").transform.TransformPoint(new Vector3(aims.transform.localPosition.x + (tmpS.width/2), aims.transform.localPosition.y));
tmpAD.speed = Vector3.Distance(transform.position, tmpAD.destinationMove) * 4; //4/1秒到达目的地
m_actionList.Add(tmpAD);
ActionData tmpAD1 = new ActionData();
tmpAD1.status = HeroStatus.attack;
tmpAD1.loop = false;
tmpAD1.destinationMove = Vector3.zero;
tmpAD1.speed = 0;
m_actionList.Add(tmpAD1);
ActionData tmpAD2 = new ActionData();
tmpAD2.status = HeroStatus.move;
tmpAD2.loop = true;
tmpAD2.destinationMove = transform.position;
tmpAD2.speed = Vector3.Distance(tmpAD.destinationMove, tmpAD2.destinationMove) * 4; //4/1秒到达目的地
m_actionList.Add(tmpAD2);
}
public void Defense()
{
ActionData tmpAD = new ActionData();
tmpAD.status = HeroStatus.defense;
tmpAD.loop = false;
tmpAD.destinationMove = GameObject.Find("UI Root/Camera").transform.TransformPoint(new Vector3(transform.localPosition.x - 25, transform.localPosition.y));
tmpAD.speed = 0.25f; //4/1秒到达目的地
m_actionList.Add(tmpAD);
ActionData tmpAD1 = new ActionData();
tmpAD1.status = HeroStatus.move;
tmpAD1.loop = false;
tmpAD1.destinationMove = transform.position;
tmpAD1.speed = 0.8f; //4/1秒到达目的地
m_actionList.Add(tmpAD1);
}
public void Hit()
{
ActionData tmpAD = new ActionData();
tmpAD.status = HeroStatus.hit;
tmpAD.loop = false;
tmpAD.destinationMove = GameObject.Find("UI Root/Camera").transform.TransformPoint(new Vector3(transform.localPosition.x - 25, transform.localPosition.y));
tmpAD.speed = 0.3f; //4/1秒到达目的地
m_actionList.Add(tmpAD);
ActionData tmpAD1 = new ActionData();
tmpAD1.status = HeroStatus.move;
tmpAD1.loop = false;
tmpAD1.destinationMove = transform.position;
tmpAD1.speed = 0.8f; //4/1秒到达目的地
m_actionList.Add(tmpAD1);
}
public void Idle()
{
m_spriteAnimation.namePrefix = Enum.GetName(typeof(HeroStatus), HeroStatus.idle);
m_spriteAnimation.loop = true;
m_spriteAnimation.ResetToBeginning();
m_staus = HeroStatus.idle;
}
public void Move()
{
// //transform.GetComponent().depth = 99;
// GameObject go = GameObject.Find("enemy").gameObject;
// destinationMove = GameObject.Find("UI Root/Camera").transform.TransformPoint(new Vector3(go.transform.localPosition.x + 98,go.transform.localPosition.y,go.transform.localPosition.z));
// m_speed = Vector3.Distance(transform.position, destinationMove) * 4; //4/1秒到达目的地
// m_staus = HeroStatus.moveto;
// m_spriteAnimation.namePrefix = Enum.GetName(typeof(HeroStatus), HeroStatus.idle);
// m_spriteAnimation.loop = true;
// m_spriteAnimation.ResetToBeginning();
}
1