簡體   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