【发布时间】:2020-07-14 17:12:56
【问题描述】:
我已经成功地在 Unity 中创建了我的第一个游戏,让用户可以在表面移动。它工作得很好。但是,我现在也希望能够通过语音输入移动播放器。当玩家听到jump 这个词时,他们会跳起来,但例如当玩家听到go 时向前移动,我只是使用了transform.Translate(2, 0, 0)。这会使玩家向前移动,但它并不关心表面如何,例如即使前方有斜坡,它也会穿过物体或直线移动。用键盘移动没有任何问题。
这是我的代码:
public class PlayerMovement : MonoBehaviour {
public CharacterController2D controller;
public Animator animator;
public float runSpeed = 40f;
float horizontalMove = 0f;
bool jump = false;
bool crouch = false;
private KeywordRecognizer keywordRecognizer;
private Dictionary<string, Action> actions = new Dictionary<string, Action>();
void Start()
{
actions.Add("Go", Go);
actions.Add("up", Up);
actions.Add("back", Back);
keywordRecognizer = new KeywordRecognizer(actions.Keys.ToArray());
keywordRecognizer.OnPhraseRecognized += RecognizedSpeech;
keywordRecognizer.Start();
}
private void RecognizedSpeech(PhraseRecognizedEventArgs speech)
{
Debug.Log(speech.text);
actions[speech.text].Invoke();
}
// Update is called once per frame
void Update () {
horizontalMove = Input.GetAxisRaw("Horizontal") * runSpeed;
animator.SetFloat("Speed", Mathf.Abs(horizontalMove));
if (Input.GetButtonDown("Jump")) {
jump = true;
animator.SetBool("IsJumping",true);
}
if (Input.GetButtonDown("Crouch")){
crouch = true;
} else if (Input.GetButtonUp("Crouch")){
crouch = false;
}
}
public void OnLanding (){
animator.SetBool("IsJumping", false);
}
void FixedUpdate()
{
// Move our character
controller.Move(horizontalMove * Time.deltaTime, crouch, jump);
jump = false;
}
void Go()
{
transform.Translate(2, 0, 0);
}
void Back()
{
transform.Translate(-2, 0, 0);
}
void Up()
{
jump = true;
animator.SetBool("IsJumping", true);
}
}
我需要进行哪些更改才能让玩家通过语音输入真正按预期移动。
非常感谢,如果是基本问题,请见谅!
【问题讨论】:
-
不同之处在于,例如在
Gotransform.Translate(2, 0, 0);"teletransports" 中,关于 2 的对象将单位固定到右侧,而controller.Move(horizontalMove * Time.deltaTime, crouch, jump);随着时间的推移以horizontalMove单位/秒 平滑移动对象 -
好的,但是为什么我不能在
Go方法中使用controller.Move(horizontalMove * Time.deltaTime, crouch, jump);?