首页 > 解决方案 > Mathf.Clamp、MovePosition 和 GetKeyDown 的问题

问题描述

我最近开始使用 Unity 进行编码,但遇到了一个问题。

我试过使用Vector3,但得到以下错误:cannot convert from void to float

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

public class FrogController : MonoBehaviour
{
    Rigidbody2D rb;

    // Start is called before the first frame update
    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    // Update is called once per frame
    void Update()
    {

    }

    void FixedUpdate()
    {  
        if (Input.GetKeyDown(KeyCode.UpArrow))
        {
            rb.MovePosition(transform.position + transform.up);
        }
        else if (Input.GetKeyDown(KeyCode.DownArrow))
        {
            rb.MovePosition(transform.position + transform.up * -1);
        }
        else if (Input.GetKeyDown(KeyCode.LeftArrow))
        {
            rb.MovePosition(transform.position + transform.right * -1);
        }
        else if (Input.GetKeyDown(KeyCode.RightArrow))
        {
            rb.MovePosition(transform.position + transform.right);
        }
    }
}

我想用它Mathf.Clamp来限制左右和上下运动transform.rigidbody

标签: c#visual-studiounity3d

解决方案


与 Vector3.Max 和 Vector3.Min 一样吗?

public Vector3 Max;
public Vector3 Min;


    void FixedUpdate()
    {  
        Vector3 desiredPosition;

        if (Input.GetKeyDown(KeyCode.UpArrow))
        {
            desiredPosition = transform.position + transform.up;
        }
        else if (Input.GetKeyDown(KeyCode.DownArrow))
        {
            desiredPosition = transform.position + transform.up * -1;
        }
        else if (Input.GetKeyDown(KeyCode.LeftArrow))
        {
            desiredPosition = transform.position + transform.right * -1;
        }
        else if (Input.GetKeyDown(KeyCode.RightArrow))
        {
            desiredPosition = transform.position + transform.right;
        }

        desiredPosition = Vector3.Min(desiredPosition, this.Max);
        desiredPosition = Vector3.Max(desiredPosition, this.Min);

        rb.MovePosition(desiredPosition);   
    }

在本例中,请务必在检查器中设置 Min 和 Max。

请注意,我们将 Max 传递给 Min 函数,将 Min 传递给 Max 函数。这是因为 Vector3.Min 返回传递给它的两个向量的较小分量。当您的仓位超过最大值时,我们要退回仓位,因为它是两者中较小的一个。当位置小于最大值时,我们需要位置(同样,两者中的较小者)。Vector3.Max 则相反。


推荐阅读