欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Unity--Stealth秘密行动开发(三):玩家移动

程序员文章站 2022-07-13 08:26:32
...

Unity–Stealth秘密行动开发(三):玩家移动

玩家移动通过动画状态机来控制,移动动画使用融合树,通过Speed去控制玩家的动画运动
Unity--Stealth秘密行动开发(三):玩家移动

1:设置成员变量
	public static Player _instance;//单例模式
    public float moveSpeed = 1;//加速度
    public float stopSpeed = 30;//减速度
    public float rotateSpeed = 10;//旋转速度
    public bool hasKey = false;//是否拥有钥匙

    private Animator anim;
    private AudioSource audio;
2.Aweak初始化
 private void Awake()
    {
        anim = this.GetComponent<Animator>();
        audio = GetComponent<AudioSource>();
        _instance = this;
    }
3.在Updata中更新玩家的动画
void Update()
    {
        //控制是否一直按下键--慢走
        if (Input.GetKey(KeyCode.LeftShift))
        {
            anim.SetBool("Sneak", true);
        }
        else
        {
            anim.SetBool("Sneak", false);
        }

        float h = Input.GetAxis("Horizontal");//水平
        float v = Input.GetAxis("Vertical"); //垂直

        //当键盘前进和左右按下
        if(Mathf.Abs(h)>0.1 || Mathf.Abs(v)>0.1)
        {
            
            float newSpeed= Mathf.Lerp(anim.GetFloat("Speed"), 3f, moveSpeed * Time.deltaTime);//差值实现--值的改变实现加速度
            anim.SetFloat("Speed", newSpeed);//更新现在的速度
            Vector3 targeDir = new Vector3(h,0,v);//得到目标方向

            //Vector3 nowDir = transform.forward; //当前方向
            //float angle= Vector3.Angle(targeDir,nowDir); //1:目标朝向 2.当前朝向----取得两个方向的夹角
            //if(angle>180)
            //{
            //    angle = 360 - angle;
            //    angle = -angle;
            //}
            //transform.Rotate(Vector3.up * angle * Time.deltaTime*rotateSpeed);//目标角度*时间*速度--控制旋转到某个角度

            //通过四元数的差值运算控制转向
            Quaternion newRotation = Quaternion.LookRotation(targeDir, Vector3.up);
            transform.rotation = Quaternion.Lerp(transform.rotation, newRotation, rotateSpeed * Time.deltaTime);

        }
        else//键抬起--渐变回初始速度
        {
            //float newSpeed = Mathf.Lerp(anim.GetFloat("Speed"),0f, moveSpeed * Time.deltaTime);//差值实现--值的改变实现加速度
            //anim.SetFloat("Speed", newSpeed);//更新现在的速度
            anim.SetFloat("Speed", 0);//直接停止运动
        }


        //判断动画当前状态是否为走路状态“Locomotion”
        if(anim.GetCurrentAnimatorStateInfo(0).IsName("Locomotion"))
        {
            PlayFootMusic();//播放
        }
        else
        {
            StopFootMusic();//停止
        }

       
    }
4:播放走路声音
private void PlayFootMusic()
    {
        if(!audio.isPlaying)
        {
            audio.Play();
        }

    }
5.停止走路声音
private void StopFootMusic()
    {
        if(audio.isPlaying)
        {
            audio.Stop();
        }
    }
6.设置共有方法,获取玩家是否有钥匙
public bool isHaskey()
    {
        return this.hasKey;
    }