簡體   English   中英

鉗位幅度不適用於 RigidBody.Velocity

[英]Clamp magnitude not working on RigidBody.Velocity

我正在使用 c# mono 和 unity3d 4.1.2。

我有以下腳本:

using UnityEngine;
using System.Collections;

public class PlayerMove : MonoBehaviour 
{
public float MoveSpeed = 10.0f;
public float maxVel = 0.000000001f;
// Use this for initialization
void Start () 
{

}

void FixedUpdate()
{
    if(Input.GetKey(KeyCode.D))
    {
        Debug.Log("D got called");
        rigidbody.AddForce(Vector3.right * MoveSpeed);
    }
    
    if(Input.GetKey(KeyCode.A))
    {
        Debug.Log("A got called");
        rigidbody.AddForce(Vector3.left * MoveSpeed);
    }
    
    rigidbody.velocity = Vector3.ClampMagnitude(rigidbody.velocity, maxVel);
    Debug.Log (rigidbody.velocity.x);
}
// Update is called once per frame
void Update () 
{
    
}
}

您可能會說,這是一個簡單的玩家移動腳本。 我有一個連接到球體的剛體,我希望通過“AddForce”沿 x 軸向左和向右移動它。

除了一個問題外,所有問題都很好,我嘗試使用“clampMagnitude”在剛體上實現最大速度,但它似乎什么也不做。 我什至將“maxVel”值設置為 0.000000001! 看看會不會發生什么事。

顯然我在這里遺漏了一些東西,有人能指出問題嗎?

附加信息:

剛體不是運動學的,但確實使用了重力(這是我計划在未來改變的一個特征,但無關緊要)。

調試信息

if(Input.GetKey(KeyCode.D))
{
rigidbody.AddForce(Vector3.right * MoveSpeed);
Debug.Log("BEFORE = " + rigidbody.velocity.magnitude);
}
    
if(Input.GetKey(KeyCode.A))
{
rigidbody.AddForce(Vector3.left * MoveSpeed);
}
    
rigidbody.velocity = Vector3.ClampMagnitude(rigidbody.velocity, maxVel);
Debug.Log("AFTER = " + rigidbody.velocity.magnitude);

在 D 上重新生成快照,之前 = 12.1911 之后 = 12.1911 之后 = 12.38866 之后 = 12.50772

更新:(答案)

多虧了 Blue 先生的一些幫助,問題似乎出在變量 maxVel 上,因為它是公開的,它似乎在我的檢查器中進行了更改,設置為私有並檢查進入固定更新已經完成了。 所以這個腳本現在可以工作了,讓用戶在剛體的 X 軸上進行 2d 控制,希望你們覺得這篇文章有用! 自我注意=剛體=頭痛!

您的 maxVel 上的默認值可能在 Unity 檢查器中為該對象設置為不同的值。 您可以重置組件,它會返回到您在腳本中設置的默認值。

為了防止將來發生這種情況,我個人的偏好是在您的腳本中將其設為private ,直到您准備好僅在 Inspector 中開始設置選項。 這可確保您在 MonoDevelop 中創建的更改是您期望生效的更改,直到您准備好將該組件完善為完整且可在 Inspector 中進行自定義。

我通過對 TODO 使用簡單的注釋來跟蹤這些變量:並注意如何使它們可調整

private float MoveSpeed = 10.0f;     //TODO: Make MoveSpeed inspector adjustable (possibly slider control)
private float maxVel = 0.000000001f; //TODO: Make maxVel inspector adjustable

我認為問題如下:在物理引擎更新之前調用FixedUpdate方法。

因此,嘗試鉗制速度無效,因為您施加到RigidBody的力將在鉗制后施加。 以這種方式獲得的唯一效果是在施加新力之前降低實際速度。 這是一個猜測,因為我對 Unity3D 中的物理不太熟悉,但我認為如果您使用WaitForFixedUpdate ,則可以在物理引擎更新后立即對其進行限制。

另一個可能與您的代碼無關的問題是您在FixedUpdate中獲取輸入。 您不應該這樣做:在Update內保持輸入處理並在FixedUpdate內施加力。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM