2017-09-26 153 views
2

所以我在Unity中做了一個2D平臺遊戲(還是c#和Unity的新手),並且我正在爲一個簡單的方塊製作一個移動腳本,並且這個方塊會隨機的停下來,我不得不跳下去開始再次移動,只是爲了再次發生。Unity 2d運動腳本問題

public class PlayerMovement : MonoBehaviour 
{ 
    public float moveSpeed; 
    public float jumpHeight; 

    void Start() 
    { 
    } 

    void Update() 
    { 
     if (Input.GetKeyDown(KeyCode.Space)) 
     { 
      GetComponent<Rigidbody2D>().velocity = new Vector2(GetComponent<Rigidbody2D>().velocity.x, jumpHeight); 
     } 

     if (Input.GetKey(KeyCode.D)) 
     { 
      GetComponent<Rigidbody2D>().velocity = new Vector2(moveSpeed, 0); 
     } 

     if (Input.GetKey(KeyCode.A)) 
     { 
      GetComponent<Rigidbody2D>().velocity = new Vector2(-moveSpeed, 0); 
     } 
    } 
} 
+1

這很可能是由於對象上的對撞機造成的。物體是否放置在「地面」上?如果沒有地面(並且禁用重力),您的腳本是否可以工作? – Bejasc

+0

您的代碼不完整'GetComponent ().velocity = new Vector2(GetComponent ().velocity.x,'這使我相信這不是正在使用的確切代碼,請提供確切的代碼。在這段代碼中似乎沒有任何功能性錯誤,就像@Bejasc指出的那樣,它可能是地面上的碰撞,確保地面是球形對撞機,或者用球形對撞機嘗試。 – Maakep

回答

0

如果您提供了我們正在使用的實際代碼,那麼在@Bejasc的評論中可能會有正確的答案。下面是一些提示,你沒有爲要求,以提高潔淨度,最佳實踐和一些功能方面代碼:

  1. 不要使用GetComponent <>()你想讀的值每次。當GameObject被創建時將它保存在一個變量中! (檢查下面代碼中的開始() - 方法)
  2. 如果玩家正在移動,則將Y-速度設置爲0,如果您想跳躍並同時移動,則此功能不起作用, Y速度跳到高度),然後移動(將Y速度設置爲0),因爲我們將Y-速度設置爲每幀0,角色將在半空中浮動。相反,將其設置爲當前的Y速度! (移動時,請檢查在new Vector2的參數y)

結果代碼:

public class PlayerMovement : MonoBehaviour 
{ 
    public float moveSpeed; 
    public float jumpHeight; 
    Rigidbody2D rb; 

    void Start() 
    { 
     rb = GetComponent<Rigidbody2D>(); 
    } 

    void Update() 
    { 
     if (Input.GetKeyDown(KeyCode.Space)) 
     { 
      rb.velocity = new Vector2(rb.velocity.x, jumpHeight); 
     } 

     if (Input.GetKey(KeyCode.D)) 
     { 
      rb.velocity = new Vector2(moveSpeed, rb.velocity.y); 
     } 

     if (Input.GetKey(KeyCode.A)) 
     { 
      rb.velocity = new Vector2(-moveSpeed, rb.velocity.y); 
     } 
    } 
} 

對於這個簡單的動作腳本,你也可以這樣做簡化了移動代碼一堆:

(假設您在Unity輸入設置中使用標準輸入設置(編輯 - >項目設置 - >輸入))

Input.GetAxis( 「水平」)將是-1如果Aleft arrowleft on a gamepad joystick被按下並1如果Dright arrowright on a gamepad joystick被按下。這是「水平」的默認設置,我猜你可以猜測「垂直」是什麼。

void Update() { 
    float moveDir = Input.GetAxis("Horizontal") * moveSpeed; 
    rb.velocity = new Vector2(moveDir, rb.velocity.y); 

    // Your jump code: 
    if (Input.GetKeyDown(KeyCode.Space)) 
    { 
     rb.velocity = new Vector2(rb.velocity.x, jumpHeight); 
    } 
} 

讓我知道你是否有問題,或者這是否有幫助。

+0

好吧,現在我知道它是一個對撞機的問題,因爲我切換到一個圓形對撞機,它的工作,但是,它產生搖搖欲墜的移動。任何方式來解決這個問題? – ODOG

+0

你可以用更詳細的描述這個問題嗎?不穩定怎麼樣?速度?你使用物理來移動你的球,如果它滑動的表面不穩定,它的移動將會搖晃。 – Maakep

+0

我今晚會檢查,昨晚沒能檢查。 – ODOG

0

我得到這個工作的唯一方法是將時間管理器中的固定時間步長更改爲0.0166。似乎物理引擎和更新與結果不同步。