2016-10-28 2 views
0

これはメインカメラに接続して使用しているスクリプトです。 カメラを360度回転できます。しかしキャラクター(ThirdPersonController)は常にアイドル状態を維持しており、常に同じ位置を向いています。カメラの回転角度に応じてキャラクタを回転させるにはどうすればいいですか?

文字を回転させるカメラを回転させると、そのようにしたいと思います。

そして私が持っている問題は、その下の地面レベルに来たものを回転させることができるということです。 カメラの回転を地上/地形レベルに制限するにはどうすればよいですか? これは私がカメラが地形/文字の下で何を意味するかのスクリーンショットです:

Screenshot

そして、これは、スクリプトコードです: 私はカメラで文字を回転させるために、この行を追加しようとしたが、そうではありませんそれは何もしません。

transform.rotation = Quaternion.RotateTowards(transform.rotation, rotation, rotationSpeed); 

スクリプト:

using UnityEngine; 
using System.Collections; 

[AddComponentMenu("Camera-Control/Mouse Orbit with zoom")] 
public class MouseOrbitImproved : MonoBehaviour 
{ 

    public Transform target; 
    public float distance = 5.0f; 
    public float xSpeed = 120.0f; 
    public float ySpeed = 120.0f; 

    public float yMinLimit = -20f; 
    public float yMaxLimit = 80f; 

    public float distanceMin = .5f; 
    public float distanceMax = 15f; 

    private Rigidbody rigidbody; 

    float x = 0.0f; 
    float y = 0.0f; 

    public float rotationSpeed = 5f; 

    // Use this for initialization 
    void Start() 
    { 
     Vector3 angles = transform.eulerAngles; 
     x = angles.y; 
     y = angles.x; 

     rigidbody = GetComponent<Rigidbody>(); 

     // Make the rigid body not change rotation 
     if (rigidbody != null) 
     { 
      rigidbody.freezeRotation = true; 
     } 
    } 

    void LateUpdate() 
    { 
     if (target) 
     { 
      x += Input.GetAxis("Mouse X") * xSpeed * distance * 0.02f; 
      y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f; 

      y = ClampAngle(y, yMinLimit, yMaxLimit); 

      Quaternion rotation = Quaternion.Euler(y, x, 0); 

      distance = Mathf.Clamp(distance - Input.GetAxis("Mouse ScrollWheel") * 5, distanceMin, distanceMax); 

      RaycastHit hit; 
      if (Physics.Linecast(target.position, transform.position, out hit)) 
      { 
       distance -= hit.distance; 
      } 
      Vector3 negDistance = new Vector3(0.0f, 0.0f, -distance); 
      Vector3 position = rotation * negDistance + target.position; 

      transform.rotation = rotation; 
      transform.position = position; 

      transform.rotation = Quaternion.RotateTowards(transform.rotation, rotation, rotationSpeed); 
     } 
    } 

    public static float ClampAngle(float angle, float min, float max) 
    { 
     if (angle < -360F) 
      angle += 360F; 
     if (angle > 360F) 
      angle -= 360F; 
     return Mathf.Clamp(angle, min, max); 
    } 
} 

私はカメラの回転に応じて文字を回転させる必要があり、新たな小さなクリーンなスクリプトを作成しました。上記のスクリプトは、メインカメラに添付されています。

は、今私はThirdPersonControllerを持っていると私はすでにそれに接続されているスクリプトがあります。このスクリプトは正常に動作している

using UnityEngine; 
using System.Collections; 

public class ClickToMove : MonoBehaviour 
{ 
    public int speed = 5; // Determines how quickly object moves towards position 
    public float rotationSpeed = 5f; 

    private Vector3 targetPosition; 
    private Animator _animator; 
    private Vector3 destination; 
    private Quaternion targetRotation; 

    void Start() 
    { 
     _animator = GetComponent<Animator>(); 
     _animator.CrossFade("Idle", 0); 
    } 

    void Update() 
    { 
     if (Input.GetKeyDown(KeyCode.Mouse0)) 
     { 
      _animator.CrossFade("Walk", 0); 
      Plane playerPlane = new Plane(Vector3.up, transform.position); 
      Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); 
      float hitdist = 0.0f; 

      if (playerPlane.Raycast(ray, out hitdist)) 
      { 
       Vector3 targetPoint = ray.GetPoint(hitdist); 
       targetPosition = ray.GetPoint(hitdist); 
       targetRotation = Quaternion.LookRotation(targetPoint - transform.position); 
       destination = targetPosition; 
      } 
     } 

     transform.rotation = Quaternion.RotateTowards(transform.rotation, targetRotation, rotationSpeed); 

     if ((transform.position - destination).magnitude < 0.7f) 
     { 
      _animator.CrossFade("Idle", 0); 
     } 
    } 
} 

。また、上のスクリプトはカメラを回転させます。 しかし、一度私はThirdPersonControllerに文字を回転させる新しい小さなスクリプトを添付すると、最初にそれは文字を回転させず、次にClickToMoveスクリプト全体が前方に歩くように文字を作っています。

using UnityEngine; 
using System.Collections; 

public class RotateCharacterToCamera : MonoBehaviour { 

    void Update() { 

     Vector3 characterPosition = transform.position; 
     Vector3 cameraPosition = Camera.main.transform.position; 
     Vector3 delta = new Vector3(characterPosition.x - characterPosition.x, 0.0f, characterPosition.z - characterPosition.z); 
     transform.LookAt(delta); 

    } 
} 

答えて

0

私は単に以下にyMinLimit値を調整するお使いのカメラの垂直角度を制限するのに十分でなければならないと思います。あなたのキャラクターの回転について

、あなたのような何か呼び出すことを彼の上に小さなスクリプトを持っている必要があります:私は0にこれだけ「水平」の向きをデルタベクトルのY値を設定し

Vector3 characterPosition = transform.position; 
Vector3 cameraPosition = Camera.main.transform.position; 
Vector3 delta = new Vector3(characterPosition.x - characterPosition.x, 0.0f, characterPosition.z - characterPosition.z); 
transform.LookAt(delta); 

をカメラの視野が考慮されます。

+0

私はカメラを持っていません。メインカメラにはメインプロパティはありません。私は変数を作成しようとカメラ_カメラをした後、私はスタート関数_camera getcomponentでしたが、その後私は_カメラを作る。私もメインを持っていません。だから私はcamera.Mainだけ_camera.transformに変更し、私はThirdPersonCharacterにスクリプトを添付し、インスペクタでこのスクリプトにメインカメラをドラッグしましたが、例外はありません、ThirdPersonControllerにはカメラが接続されていませんが、カメラにアクセスしようとしています。 –

+0

私はカメラスクリプトの問題で私の質問を更新しました。もし私がスクリプトにカメラをドラッグしたら、それはなぜヌルですか? –

+0

@mosheralf私は誤字を犯しました。「camera.Main」ではなく「Camera.main」であるはずでした(これにより、メインカメラに簡単にアクセスできます)。_camera = GetComponent (); 'を呼び出すと、インスペクタで割り当てられた_Camera_フィールドをオーバーライドして、_Start()_メソッドの行をオーバーライドします。 null 'オブジェクト(あなたが持っているエラーの原因となります)。 – Kardux

関連する問題