2017-12-11 6 views
1

私はマウス指向のゲームの基本的なコントロールを作っています。カメラをプレイヤーに追従させ、コサインの法則を使って角度を見つけるためにカメラを回転させたいと思います。ここに私のコードは次のとおりです。ユニティ:回転するコサインの法則を使ったカメラ

//Move Camera 
camX = player.transform.position.x; 
camY = 15.5f; 
camZ = player.transform.position.z; 

//Rotate Camera 
rotTriA = player.transform.position.x; 
rotTriB = player.transform.position.z; 
rotTriC = Mathf.Sqrt((rotTriA * rotTriA) + (rotTriB + rotTriB)); 

if(rotTriA > 0 && rotTriB > 0) 
{ 
    getAngle = (Mathf.Acos(((rotTriA * rotTriA) 
     + (rotTriB * rotTriB) 
     - (rotTriC * rotTriC)) 
     /(2 * (rotTriA) * (rotTriB))) * Mathf.Rad2Deg); 
} 
else if(rotTriA > 0 && rotTriB < 0) 
{ 
    getAngle = (Mathf.Acos(((rotTriA * rotTriA) 
     + (rotTriB * rotTriB) 
     - (rotTriC * rotTriC)) 
     /(2 * (rotTriA) * (rotTriB))) * Mathf.Rad2Deg) + 90; 
} 
else if(rotTriA < 0 && rotTriB < 0) 
{ 
    getAngle = (Mathf.Acos(((rotTriA * rotTriA) 
     + (rotTriB * rotTriB) 
     - (rotTriC * rotTriC)) 
     /(2 * (rotTriA) * (rotTriB))) * Mathf.Rad2Deg) + 180; 
} 
else if(rotTriA < 0 && rotTriB > 0) 
{ 
    getAngle = (Mathf.Acos(((rotTriA * rotTriA) 
     + (rotTriB * rotTriB) 
     - (rotTriC * rotTriC)) 
     /(2 * (rotTriA) * (rotTriB))) * Mathf.Rad2Deg) + 270; 
} 
else if(rotTriA == 0 && rotTriB > 0) 
{ 
    getAngle = 90; 
} 
else if(rotTriA == 0 && rotTriB < 0) 
{ 
    getAngle = 270; 
} 
else if(rotTriA > 0 && rotTriB == 0) 
{ 
    getAngle = 0; 
} 
else if(rotTriA < 0 && rotTriB == 0) 
{ 
    getAngle = 180;  
} 
else 
{ 
    getAngle = 0; 
} 

Debug.Log(getAngle); 

if (camZ < 0) 
{ 
    camZ = player.transform.position.z + 10.5f; 
    transform.eulerAngles = new Vector3(135f, getAngle, 0.0f); 
} 
else 
{ 
    camZ = player.transform.position.z - 10.5f; 
    transform.eulerAngles = new Vector3(45f, getAngle, 0.0f); 
} 
camZ = player.transform.position.z - 15.5f; 
cam = new Vector3(-camX, camY, camZ); 
mainCamera.transform.position = cam; 

私はカメラがプレイヤーに追従させる方法を知っているが、私はそれが怖がらずにプレイヤーの周りを回転するカメラを作る方法がわかりません。

私はプレイヤーを移動するためにレイキャスティングを使用していますので、私はマウスをアリーナの外に移動すると動きが登録されません。値が得られるので余弦の法則を行っていない可能性があります400まで(サークルが360度であれば可能ではありません)。

+0

あなたはこれを行うためにこれをやっていますか?カメラをオブジェクトの周りに回転させる簡単な方法を探しているのであれば、いくつかの追加や基本的なUnity APIを使って行うことができます。 – Foggzie

+0

@Foggzie私は簡単な方法を考えることができませんでした。 –

+0

@Foggzie私はちょうどそれがプレーヤーの周りを回転したい。 –

答えて

0

カメラをプレーヤーの周りで回転させる最も簡単な方法は、ゲームオブジェクトの階層を利用することです。

まず、空のGameObjectを行い、その後、あなたのカメラ、それの子を作る:

EmptyObject 
    > Camera 

は今、空のオブジェクトの位置を見るためにカメラを向けます。この空のオブジェクトの場所は、カメラが「探している」場所になりました。カメラは子供のため、このオブジェクトを回転すると、カメラはそのオブジェクトの周りを回転します(空のオブジェクトに面する向きを維持したまま)。

それを見ながら、空のオブジェクトは、子育てを変換するためのおかげで、その周りに「軌道」のカメラを行います回転させる簡単なスクリプト:EmptyObjectオブジェクトにこのようなものを取り付け

using UnityEngine; 

public class CameraInput : MonoBehaviour 
{ 
    [SerializeField] private float rotationAcceleration; // radians/(frame^2) 
    [SerializeField] private float rotationSpeedMax; // radians/frame 
    [SerializeField] private float rotationDamping; // 0.99 

    private float rotationSpeed; 

    private void Awake() 
    { 
     rotationSpeed = rotationSpeedMax/4; 
    } 

    private void Update() 
    { 
     if (Input.GetKey(KeyCode.A)) 
     { 
      rotationSpeed += rotationAcceleration; 
     } 
     if (Input.GetKey(KeyCode.D)) 
     { 
      rotationSpeed -= rotationAcceleration; 
     } 

     rotationSpeed = Mathf.Clamp(
      rotationSpeed, -rotationSpeedMax, rotationSpeedMax); 

     transform.Rotate(0f, rotationSpeed, 0f); 

     rotationSpeed *= rotationDamping; 
    } 
} 

を行いますトリック。今すぐあなたのキャラクターに従うためにこの空のオブジェクトが必要です。回転関数は引数としてラジアンを受け入れますので、小さな[0.00〜0.01]の数字を使いたいでしょう。また、これはフレームごとの実装であるため、フレームレートがスムーズな場合にのみスムーズに動作します。あなたは最終的にそれにTime.deltaTimeファクタを持っていると思います。

+0

私は、マウスが中心からの位置に基づいてカメラを回転させたい。 –

+0

@BradleyWilliamElkoあなたはそれを説明するために、図面やビジュアルが必要になります。私はあなたがそれによって何を意味するか分からない。 – Foggzie

+0

@BradleyWilliamElkoスクリプトとロジックは簡単に移植可能ですが、それは任意のオブジェクトの周りにカメラを回転させるという課題を解決しました。あなたが望むものを受け入れるように入力を変更することができます。 – Foggzie

関連する問題