如何在按下W键时使人物行走,在停止按下时空转/接地?

时间:2017-08-31 13:13:28

标签: c# unity3d unity5

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CC : MonoBehaviour
{
    private Vector3 moveDirection = Vector3.zero;
    private Animator _anim;

    private void Start()
    {
        _anim = GetComponent<Animator>();   
    }

    void Update()
    {
        var x = Input.GetAxis("Horizontal") * Time.deltaTime * 150.0f;
        var z = Input.GetAxis("Vertical") * Time.deltaTime * 3.0f;

        transform.Rotate(0, x, 0);
        transform.Translate(0, 0, z);

        if (Input.GetKeyDown("w"))
        {
            _anim.Play("Walk");
        }
        else
        {
            _anim.Play("Grounded");
        }
    }
}

当我刚刚做的时候:

_anim.Play("Walk");

角色正在不停前行。 但是现在我想让他走路,当我按住W并且不按W来闲置/接地时。

但是没有工作,角色没有走路就行动了。

脚本附加到第三人称角色。

2 个答案:

答案 0 :(得分:2)

即使未按下“w”,您也正在翻译变换。在if案例中移动翻译,一切都将按计划运行。此外,GetKeyDown应替换为GetKey,并且应保存当前状态,因为第一个的定义为:

  

您需要从Update函数调用此函数,因为每个帧都会重置状态。在用户释放该键并再次按下该键之前,它不会返回true。 - Input.GetKeyDown

代码可能如下所示:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CC : MonoBehaviour
{
    private Vector3 moveDirection = Vector3.zero;
    private Animator _anim;
    private bool _isWalking = false;

    private void Start()
    {
         _anim = GetComponent<Animator>();   
    }

    void Update()
    {
        var x = Input.GetAxis("Horizontal") * Time.deltaTime * 150.0f;

        transform.Rotate(0, x, 0);

        if (Input.GetKey("w"))
        {
            if(!_isWalking)
            {
                _isWalking = true;
                _anim.Play("Walk");
            }
            var z = Input.GetAxis("Vertical") * Time.deltaTime * 3.0f;
            transform.Translate(0, 0, z); // Only move when "w" is pressed.
        }
        else
        {
            if(_isWalking)
            {
                _anim.Play("Grounded");
            }
            _isWalking = false;
        }
    }
}

答案 1 :(得分:1)

每个新帧都会调用

update(),但getKeyDown()方法仅在用户按下按钮的帧期间返回true。由于你一直按下w-Key,声明返回false并且#34;接地&#34;块被执行。

尝试在Input.GetKeyDown()上启动动画但仅使用Input.GetKeyUp();将动画更改为空闲