unity中的状态机

来源:互联网 发布:足球排阵容软件 编辑:程序博客网 时间:2024/05/29 04:28

状态机是unity中很重要的一个概念,不要听这个名词很复杂,其实是很简单的东西,比如一个人,有吃饭,睡觉,学习这些不同的状态,游戏中的东西,也有不同的状态,下面以怪物为例,说明unity中状态机的用法.

第一步 生成不同状态下的动画

美工一般会把不同的状态先做成一些序列贞,放在一个图里面.我们一般先确定开始的时候,怪物的状态要用到哪些图片,把这几个图选中,往Hierachy窗口一拖,就生成了第一个状态的动画.我们叫他idle状态,然后我们找到追赶玩家要用到的几张图片,全选后,拖到刚才的动画上(不要拖到新位置,拖到新位置的话,会生成新的),这样就会给刚才那个对象新加了一个动画,重复这个动作,直到所有动画添加完

第二步 添加不同的变量,来控制状态之间的切换

比如怪物跟玩家接近一定的距离,就要切换到追赶玩家的状态

怪物死的时候,就要切换到死亡状态,因此要设2个变量

Run,dead都是bool型的

然后在animator窗口,创建状态切换线,任何状态在dead等于true的时候,切换到dead,idle状态下run为true的时候,切换到run,run状态下,run为false就切换回idle

第三步在程序里设置动画的变量,以便状态机控制器能正确的切换不同状态


public class enemy : MonoBehaviour
{


    public Transform Player;
    public float attackDistance = 25;
    public Animator anim;
// Use this for initialization
void Start ()
{
        
   anim = GetComponent<Animator>();
        
}

// Update is called once per frame
void Update ()
{
        float distance = Vector3.Distance(transform.position, Player.position);
        //print(distance);
        if (distance < attackDistance)
        {
            anim.SetBool("Run", true);
        }
        else
        {
            anim.SetBool("Run", false);
        }


   if (transform.position.x < Player.position.x)
   {
       transform.localScale = new Vector3(1, 1, 1);
            transform.position = new Vector3(transform.position.x + 0.01f, transform.position.y, transform.position.z);
   }
   else
   {
            transform.localScale = new Vector3(-1, 1, 1);
            transform.position = new Vector3(transform.position.x - 0.01f, transform.position.y, transform.position.z);
   }
}
}

比如上面的代码,检查玩家和怪物之间的距离,距离小于25以后,就设置动画的run变量为true,这样状态机控制器,就会把怪物的动画切换到run的状态了

0 0