2016-07-05 15 views
0

私はしばらく何か試してきましたが、なぜ動作していないのかわかりません。 私はPathHolderの親に単純なパスの空のオブジェクトとそのパスに続く文字オブジェクトを持っていて、それが向いているポイントに向かって滑らかに回転します。私の問題は時間の半分であり、キャラクタオブジェクトは完全に回転せず、まだその点に向かって動きます。 もう一つ変わったことは、ポイントを近づけるとオブジェクトがどれくらい回転するかが減少し、それをさらに動かすと文字がポイントに向くことになります。しかし、どのような状況でも動作するようにパスを柔軟にする必要があるため、距離を回転に影響させることはできません。Quaternion.LookRotationの角度が正しく機能していない

理想的には、矢印キーを押したときにキャラクターが完全にスムーズに回転して、プレイヤーがキーを離したときにキャラクターが途中で止まらないようにしたいと思っています。 -

using UnityEngine; 
using System.Collections; 

public class CharacterControllerPath : MonoBehaviour 
{ 
    enum Direction {Forward, Backward}; 
    Direction charDirection; 

    public PathEditor pathToFollow; 

    private Vector3 targetPosition; 

    public string pathName; 
    public int wayPointID = 0; 
    public float speed; 
    public float rotationSpeed = 7.0f; 

    private float reachDistance = 1.0f; 
    private float distanceX; 
    private float distanceY; 

    void Start() 
    { 
     transform.position = new Vector3(pathToFollow.pathObj[wayPointID].transform.position.x, transform.position.y, pathToFollow.pathObj[wayPointID].transform.position.z); 
     charDirection = Direction.Forward; 
     Vector3 targetPosition = new Vector3(pathToFollow.pathObj[wayPointID + 1].transform.position.x, transform.position.y, pathToFollow.pathObj[wayPointID + 1].transform.position.z); 
     transform.LookAt(targetPosition); 
    } 

    void FixedUpdate() 
    { 
     Movement(); 
    } 

    void Movement() 
    { 
     if(Input.GetKey(KeyCode.RightArrow)) 
     { 
      charDirection = Direction.Forward; 

      //Move 
      targetPosition = new Vector3(pathToFollow.pathObj[wayPointID].transform.position.x, transform.position.y, pathToFollow.pathObj[wayPointID].transform.position.z); 
      transform.position = Vector3.MoveTowards(transform.position, targetPosition, speed * Time.deltaTime); 

      //Rotate 
      targetPosition = new Vector3(pathToFollow.pathObj[wayPointID].transform.position.x, 0, pathToFollow.pathObj[wayPointID].transform.position.z); 
      var rotation = Quaternion.LookRotation(targetPosition); 
      transform.rotation = Quaternion.Slerp(transform.rotation, rotation, speed * Time.deltaTime); 

      if(transform.position.x == targetPosition.x && transform.position.z == targetPosition.z) 
       wayPointID++; 
     } 
     else if(Input.GetKey(KeyCode.LeftArrow)) 
     { 
      charDirection = Direction.Backward; 

      //Move 
      targetPosition = new Vector3(pathToFollow.pathObj[wayPointID - 1].transform.position.x, transform.position.y, pathToFollow.pathObj[wayPointID - 1].transform.position.z); 
      transform.position = Vector3.MoveTowards(transform.position, targetPosition, speed * Time.deltaTime); 

      //Rotate 
      targetPosition = new Vector3(pathToFollow.pathObj[wayPointID - 1].transform.position.x, 0, pathToFollow.pathObj[wayPointID - 1].transform.position.z); 
      var rotation = Quaternion.LookRotation(targetPosition); 
      transform.rotation = Quaternion.Slerp(transform.rotation, rotation, speed * Time.deltaTime); 

      if(transform.position.x == targetPosition.x && transform.position.z == targetPosition.z) 
       wayPointID--; 
     } 

     if(wayPointID >= pathToFollow.pathObj.Count) 
     { 
      //Put code to finish the level 
      wayPointID = (pathToFollow.pathObj.Count - 1); 
     } 
     else if(wayPointID <= 0) 
      wayPointID = 0; 
    } 
} 
+0

私は 'pathToFollow'のポイントをworld-relativeと仮定しますか?キャラクタをその方向に見たい場合は、そのキャラクタに関連するベクトルを与えていることを確認する必要があります。 – rutter

+0

すぐにお返事ありがとうございます!しかし、私はあなたが何を言っているのか十分に理解していません。 – Septos

+0

Unityの何らかの理由でクォータニオンを使用しないでください。単に "LookAt"を使用してください。https://docs.unity3d.com/ScriptReference/Transform.LookAt.html – Fattie

答えて

0

次の2つのベクトルの間の円滑なベクトルを移動したい場合は、Input.GetInputRaw(「ヨコ」)間の値だけです

Vector3.Lerp(firstPosOrRotation, secondPosOrRotation, Time.deltaTime*Input.GetInputRaw("Horizontal")*speed); 

を使用します。ここに私はこれまで持っているコードです。 1と1は、押されている矢印キーに依存します。 これで、パス内の各点と次の点を取得し、それらの間でLerpを取得します。

  • 回転のために、代わりTime.deltaTimeの編集 及び全てなお、本

    回転= Vector3.Lerp(rotationA、rotationB、Mathf.Clamp(DIST(POS、 finalPos)を行い、 0、1);

    DIST(POS、 finalPos)=量が点AとB

間移動私は、これは明らかENであることを望みます大丈夫、 あなたがそのことを意味しているか、オブジェクトがパス上を前方に向いているかどうかわかりません。

+0

あなたの答えをありがとう、しかし、言及したように、動きはうまく動作し、私は1つのポイントから他のポイントに移動することができます、問題は文字が私のquaternion.LookRotation()でも時には正しい方向に直面していないということです。私はまっすぐ進む道を持っていますし、右、そして左にいて、右の矢印を押すだけでそれに従っていますが、最初の点に向かって移動すると、文字は完全に回転せず、232.52度になりますそれが次の点に向かうとき、それは完全に直面している。 – Septos

+0

さて、位置については、私が言ったことを行うが、回転のためにVector3.Lerpを実行するが、Time.deltaTimeとその他のものはどれもオブジェクトが2つのパスポイント間を移動し、0と1 –

関連する問題