2016-12-29 7 views
3

私は現在Unityで移動するためにクリックを使用しているゲームに取り組んでいます。マップ上の地点をクリックすると、そのマウスのクリックを目的地に設定してから、ゲームオブジェクトのrigidBodyを使用してRigidBody.MovePosition()を使用して移動します。私がこれをすると、ゲームオブジェクトが目的地に到達すると、ちらつきが増えています。いかなる援助も感謝します。ありがとう。速度ベースの動作を使用するときのポイントに達するUnity3D RigidBody MovePosition Flicker

// COMPONENTS 
Rigidbody rigidBody; 

// MOVEMENT 
Vector3 destination; 
Vector3 direction; 

// Use this for initialization 
void Start() 
{ 
    rigidBody = GetComponent<Rigidbody>(); 
    destination = transform.position; 
} 

// Update is called once per frame 
void Update() 
{ 
    DetectInput(); 
} 

void FixedUpdate() 
{ 
    MoveControlledPlayer(); 
} 

void MoveControlledPlayer() 
{ 

    transform.LookAt(destination); 
    Vector3 direction = (destination - transform.position).normalized; 
    rigidBody.MovePosition(transform.position + direction * 5 * Time.deltaTime); 
} 

void DetectInput() 
{ 
    if (Input.GetMouseButton(0)) 
    { 
     SetDestination(); 
    } 
} 

void SetDestination() 
{ 
    if (!EventSystem.current.IsPointerOverGameObject()) 
    { 
    Plane field = new Plane(Vector3.up, transform.position); 
    Ray ray; 
    float point = 0; 

    ray = Camera.main.ScreenPointToRay(Input.mousePosition); 

    if (field.Raycast(ray, out point)) 
     destination = ray.GetPoint(point); 

    } 
} 
+0

宛先はポイントです。したがって、* exact *同じ位置に到達することは難しいです。あなたの目的地が本当にあなたのオブジェクトから本当に近いときに、ケースを管理するいくつかのコードを追加する必要があります。 – Greg

+1

ありがとうございます。それは私のために働いた。シンプルで簡単な修正。とても有難い。 – user3623692

答えて

0

は本当に難しいです、そして多くの場合、ちらつきになります。オブジェクトは、常に彼の目的地の上を通過されるためです。

修正する方法は、オブジェクトがターゲットに十分に近いときに移動を停止することです。

1

私は一時的な関節でこれらの動きをします。それらは非常に正確で/設定可能/埋め込み可能です。

2Dでは、剛体のポイント間、またはボディとワールドポイントの間の距離を制御するためにDistanceJoint2Dを使用します。 3DではSpringJointまたはConfigurableJointを使用できます。

次に、基本的に距離をトゥイーンして、フレームごとに同じ方法で移動します(FixedUpdate)。