Разница в том, что, например, в Go
transform.Translate(2, 0, 0);
"телетранспортирует" объект примерно на 2 фиксирует единицы вправо, в то время как controller.Move(horizontalMove * Time.deltaTime, crouch, jump);
перемещает объект плавно во времени с помощью horizontalMove
единиц / второй.
Также обратите внимание, что вы не должны смешивать движения через Transform
с Rigidbody
(/ Rigidbody2D
) .. это нарушает физику.
Вы можете просто использовать
public void Go
{
controller.Move(runSpeed * 2, crouch, jump);
}
public void Back
{
controller.Move(runSpeed * -2, crouch, jump);
}
Я бы, однако, использовал Coroutine , который имитирует нажатие кнопки в течение определенного времени после голосовой команды и оставит движение в FixUpdate
на месте, например,
// How long shall the character move into the direction after voice command?
[SerializeField] private float voicePressDuration = 1f;
private bool isVoiceCommand;
private Coroutine voiceRoutine;
void Update ()
{
if(!isVoiceCommand) 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;
}
}
void Go()
{
if(voiceRoutine != null)
{
// evtl interrupt an already running routine
StopCoroutine(voiceRoutine);
}
voiceRoutine = StartCoroutine(ProcessVoiceMove(runSpeed));
}
void Back()
{
if(voiceRoutine != null)
{
// evtl interrupt an already running routine
StopCoroutine(voiceRoutine);
}
voiceRoutine = StartCoroutine(ProcessVoiceMove(-runSpeed));
}
private IEnuermator ProcessVoiceMove(float value)
{
isVoiceCommand = true;
horizontalMove = value;
yield return new WaitForSeconds(voicePressDuration);
isVoiceCommand = false;
}
Таким образом, после того, как вы скажете, например, Go
, объект будет двигаться вперед в течение одной секунды или того, что вы настроили в voicePressDuration
.