统一变换有问题

having problems with unity transform

所以,我用 wallrunning 制作了一个基本的移动脚本,并想为其添加冲刺,起初我为角色制作了冲刺参数并使用 debug.log 测试它按预期工作,但实际冲刺命令 transform.translate(Vector3.forward) 由于某种原因无法正常工作。

这是代码:

public class PlayerMovement : MonoBehaviour
{

    public Transform player;
    
    public CharacterController controller;
    
    public float speed = 12f;
    public float baseSpeed;
    
    Vector3 velocity;
    
    public float gravity = -9.81f;
    
    public Transform groundCheck;
    public float groundDistance = 0.4f;
    public LayerMask groundMask;
    
    public Transform wallCheckL;
    public Transform wallCheckR;
    public float wallDistanceL = -0.4f;
    public float wallDistanceR = 0.4f;
    public LayerMask wallMask;
    public bool touchWallL;
    public bool touchWallR;
    
    public float SlideTime = 10f;
    
    public float Ynormal;
    
    
    
    public bool isGrounded;
    public bool Sprinting;
    public bool Crouching;
    public bool Sliding;
    public bool canDash;
    
    // Start is called before the first frame update
    void Start()
    {
        baseSpeed = speed;
        canDash = true;
    }
    
    // Update is called once per frame
    void Update()
    {
        isGrounded = Physics.CheckSphere(groundCheck.position, groundDistance, groundMask);
    
        touchWallL = Physics.CheckSphere(wallCheckL.position, wallDistanceL, wallMask);
        touchWallR = Physics.CheckSphere(wallCheckR.position, wallDistanceR, wallMask);
    
    
        if (isGrounded && velocity.y < 0)
        {
            velocity.y = -2f;
        }
    
        float x = Input.GetAxis("Horizontal");
        float z = Input.GetAxis("Vertical");
    
        Vector3 move = transform.right * x + transform.forward * z;
    
        controller.Move(move * speed * Time.deltaTime);
    
        velocity.y += gravity * Time.deltaTime;
    
        controller.Move(velocity * Time.deltaTime);
    
        if ((isGrounded == true) && Input.GetKeyDown("space"))
        {
            velocity.y = 10f;
        }
    
        if (Input.GetKeyDown(KeyCode.LeftShift))
        {
            speed = baseSpeed * 1.5f;
            Sprinting = true;
        }
        if (Input.GetKeyUp(KeyCode.LeftShift))
        {
            speed = baseSpeed;
            Sprinting = false;
        }
    
        if (Input.GetKeyDown(KeyCode.LeftControl))
        {
            Crouching = true;
        }
        if (Input.GetKeyUp(KeyCode.LeftControl))
        {
            Crouching = false;
        }
    
        if (Crouching)
        {
            transform.localScale = new Vector3(1f, 0.5f, 1f);
    
        } else if (Crouching == false)
        {
            transform.localScale = new Vector3(1f, 1f, 1f);
        }
    
        if (Sprinting && Crouching)
        {
            Sliding = true;
        } else if (Sprinting == false && Crouching == false)
        {
            Sliding = false;
        }
    
        if (Sliding)
        {
            speed = baseSpeed * 2;
            transform.localScale = new Vector3(1f, 0.25f, 1f);
        }
    
        Ynormal = transform.localEulerAngles.y;
    
        if (touchWallL)
        {
            gravity = -4.4f;
            transform.localRotation = Quaternion.Euler(0, Ynormal, -20f);
            isGrounded = true;
        } else if (touchWallR)
        {
            gravity = -4.4f;
            transform.localRotation = Quaternion.Euler(0f, Ynormal, 20f);
            isGrounded = true;
        }
        else
        {
            gravity = -9.81f;
            transform.localRotation = Quaternion.Euler(0f, Ynormal, 0f);
        }
    
        if (touchWallR && Input.GetKeyDown(KeyCode.Space))
        {
            velocity.y = 10f;
            transform.position += Vector3.left * Time.deltaTime * 100;
        }
    
        if (Input.GetKeyDown(KeyCode.E) && canDash)
        {
            Dash();
        }
    
    }
    
    void Dash()
    {
        StartCoroutine(dashTimer());
        player.transform.Translate(Vector3.forward * Time.deltaTime * speed);
    }
    
    IEnumerator dashTimer()
    {
        canDash = false;
        yield return new WaitForSeconds(2f);
        canDash = true;
        
    }
}

要求本身有效,我做了一些测试,但破折号本身没有。我尝试了 controller.move、transform.position += transform.position,甚至将一个名为 dash distance 的游戏对象设为空,并尝试将我的角色传送到那里,但是 none 成功了,全部这导致我的角色在我尝试冲刺时什么也没做。

这是因为Transform.Translate实际上每帧都需要更新。

尝试像这样重构一下:

// add another control flag
private bool isDashing = false;

void Update()
{
    //...
    if (Input.GetKeyDown(KeyCode.E) && canDash)
    {
        StartCoroutine(dashTimer());
    }

    if (isDashing)
    {
        Dash();
    }
    
}

void Dash()
{
    player.transform.Translate(Vector3.forward * Time.deltaTime * speed);
}

IEnumerator dashTimer()
{
    canDash = false;
    isDashing = true;
    yield return new WaitForSeconds(2f);
    canDash = true;
    isDashing = false;   
}