繁体   English   中英

Unity C# 运动基于旋转?

[英]Unity C# Movement based on rotation?

我目前正在使用 Unity 3D 中的网格,并且无法将我的播放器保持在网格上。 我的运动脚本是这样工作的:

  1. 当按下'w'时,rb.position += rb.rotation * Vector3.forward * 10;
  2. posX = rb.position.x / 10,posY = rb.position.z / 10

我目前的问题是我还没有找到如何让我的玩家不离开棋盘的解决方案。 这尤其困难,因为根据玩家的旋转,'w' 可以将 +/- 1 添加到 x,或 +/- 到 y。 这对于向左、向右和向后移动也是一样的,所有值都基于旋转。

我还计划重新设计移动系统以自动将玩家捕捉到变量 posX 和 posY 的值。 我能想到的对系统进行编程的唯一方法就是简单地对其进行硬编码(if (rotation = 0) {posX + 1}, if (rotation = 90) {posY + 1}, if (rotation = 180) {posX- 1 },如果(旋转 = 270){posY - 1})。 非常低效。

关于如何解决这个问题的任何想法?

    public class Movement : MonoBehaviour
{   bool Rotating = false;
    bool Moving = false;
    public Rigidbody rb;
    private Quaternion endRotation;
    [SerializeField] private AnimationCurve curve;
    private Quaternion startRotation;
    private Vector3 startPosition;
    public GameObject Grid;
    private Vector3 endPosition;
    public int xRange;
    public int yRange;
    public float posX;
    public float posY;
    public float desiredDuration = 1f;
    private float elapsedTime;
    float percentageComplete = 0f;  

    private void Awake(){
        rb = GetComponent<Rigidbody>();
        var grid = Grid.GetComponent<GridCreation>();
        xRange = grid.width;
        yRange = grid.height;
    }

    public void TurnRight(InputAction.CallbackContext context){ 
            
            if (context.started && Rotating == false && Moving == false) {
                percentageComplete = 0;
                startRotation = rb.rotation;
                endRotation = startRotation * Quaternion.Euler(0,90,0);
                Rotating = true;
                elapsedTime = 0;
            }
            }
    public void TurnLeft(InputAction.CallbackContext context){ 
            
            if (context.started && Rotating == false && Moving == false) {
                percentageComplete = 0;
                startRotation = rb.rotation;
                endRotation = startRotation * Quaternion.Euler(0,-90,0);
                Rotating = true;
                elapsedTime = 0;
            }}
    //MOVING BASED ON ROTATION//
    public void Forward(InputAction.CallbackContext context){ 
            
            if (context.started && Rotating == false && Moving == false) {
                    percentageComplete = 0;
                    startPosition = rb.position;
                    endPosition += rb.rotation * Vector3.forward * 10;
                    endPosition[1] = 1;
                    Moving = true;
                    elapsedTime = 0;
                    ;
            }}
            
    public void Update() { 
        if (Rotating == true){
            if (percentageComplete < 1) {
                elapsedTime += Time.deltaTime;
                percentageComplete = elapsedTime / desiredDuration;
                rb.rotation = Quaternion.Lerp(startRotation, endRotation, curve.Evaluate(percentageComplete));
            }
                       
            if (percentageComplete > 1) {
                Rotating = false;}
                            }
        if (Moving == true){
            if (percentageComplete < 1) {
                elapsedTime += Time.deltaTime;
                percentageComplete = elapsedTime / desiredDuration;
                rb.position = Vector3.Lerp(startPosition, endPosition, curve.Evaluate(percentageComplete));
            if (percentageComplete > 1) {
                Moving = false;
                // returns players current position on board
                posX = Mathf.Round(rb.position.x / 10);
                posY = Mathf.Round(rb.position.z / 10);}
        }

    }
        }}

嘿,我认为您可以使用Colliders来防止玩家从板上掉下来! 只需在 Board 周围添加Empty GameObjects并给它们 Colliders,当玩家撞到 Collider 时,它就像一堵无形的墙一样工作,阻止玩家走得更远。 如果需要,您甚至可以将材质添加到对撞机中,使玩家从隐形墙上反弹。 我认为最好使用BoxCollider ,因为它可能最适合您的网格。 我希望我能帮助你! :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM