カメラの範囲制限
カメラが後ろを振り向くのを防ぐプログラムです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class charcontroller : MonoBehaviour { public float mainSPEED; public float x_sensi; public float y_sensi; public new GameObject camera; public Vector3 cameraAngle; void Start() { } void Update() { movecon(); cameracon(); } void movecon() { Transform trans = transform; transform.position = trans.position; trans.position += trans.TransformDirection(Vector3.forward) * Input.GetAxis("Vertical") * mainSPEED; trans.position += trans.TransformDirection(Vector3.right) * Input.GetAxis("Horizontal") * mainSPEED; } void cameracon() { float x_Rotation = Input.GetAxis("Mouse X"); float y_Rotation = Input.GetAxis("Mouse Y"); x_Rotation = x_Rotation * x_sensi; y_Rotation = y_Rotation * y_sensi; this.transform.Rotate(0, x_Rotation, 0); camera.transform.Rotate(-y_Rotation, 0, 0); cameraAngle = camera.transform.localEulerAngles; if (cameraAngle.x < 280 && cameraAngle.x > 180) { cameraAngle.x = 280; } if (cameraAngle.x > 45 && cameraAngle.x < 180) { cameraAngle.x = 45; } cameraAngle.y = 0; cameraAngle.z = 0; camera.transform.localEulerAngles = cameraAngle; } } |
先に言っておきます。
これはあんまり使わない方がいいと思います。
理由は、マウスの勢いが垂直方向に対して激しすぎると45~280度の域を貫通して反対側(下を向いていたら上を向いてしまう)に視点が瞬間移動してしまいます。
通常プレイではそんなことはないとは思いますが、私個人としてはあまり使用はお勧めできません。
あと、制限範囲から出ようとマウスを上下すると少しガタガタします。
追記は、11行目、38~49行目です。
11行目は、カメラの角度を保存する用の変数の宣言をしています。
38行目は、cameraAngleという変数に現在のオイラー角の値を代入しています。
39~46行目は、カメラの角度が280~360度、45~0度の間だけ動くようにするプログラムです。
47、48行目は、バグ防止用のカメラの角度のYとZの軸を動かないようにしています。
49行目は上記の計算の元算出された数値を実際のカメラの角度に代入しているプログラムです。
先に言いましたがこれはお勧めしません。
このプログラムは少し改良が必要です…
カメラの角度と頭の角度の同期
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class charcontroller : MonoBehaviour { public float mainSPEED; public float x_sensi; public float y_sensi; public new GameObject camera; public Vector3 cameraAngle; [SerializeField] GameObject head; void Start() { } void Update() { movecon(); cameracon(); } void LateUpdate() { head.transform.localEulerAngles = new Vector3(0, 0, -cameraAngle.x); } void movecon() { Transform trans = transform; transform.position = trans.position; trans.position += trans.TransformDirection(Vector3.forward) * Input.GetAxis("Vertical") * mainSPEED; trans.position += trans.TransformDirection(Vector3.right) * Input.GetAxis("Horizontal") * mainSPEED; } void cameracon() { float x_Rotation = Input.GetAxis("Mouse X"); float y_Rotation = Input.GetAxis("Mouse Y"); x_Rotation = x_Rotation * x_sensi; y_Rotation = y_Rotation * y_sensi; this.transform.Rotate(0, x_Rotation, 0); camera.transform.Rotate(-y_Rotation, 0, 0); cameraAngle = camera.transform.localEulerAngles; if (cameraAngle.x < 280 && cameraAngle.x > 180) { cameraAngle.x = 280; } if (cameraAngle.x > 45 && cameraAngle.x < 180) { cameraAngle.x = 45; } cameraAngle.y = 0; cameraAngle.z = 0; camera.transform.localEulerAngles = cameraAngle; } } |
追記は12行目、23~26行目です。
12行目は、headというゲームオブジェクトを入れる変数を宣言しています。
23~26行目は、頭の角度にカメラの角度を代入しています。
インタースペクター内のHeadの中にユニティちゃんの頭を格納しましょう。
ユニティちゃんの頭はCharacter1_Headです。
それだけです(笑)
結構簡単でしょう?(笑)
終わりに
UnityでFPSを作りたい人はたくさんいると思いますが、自分もその一人でした。
しかし、ネットで実際に調べて動かしてみると少し違ったり、自分の思うようなFPSゲームを作れませんでした。(自分の調べ不足の可能性もありますが…)
さらに初めてゲーム制作する人が、Unityでゲームを作りたい!と思いながらも実際に手を付けてみたが、思っていたものが作れない…
なんてこともあるでしょう。
そうやって諦めていってほしくないので今回、Unityに関する記事を書きました。
私もまだまだUnityのプログラムに自信がないので、自信を持って皆さんに良い情報を発信できるように努めていきたいと思います。
それでは皆様、この記事を読んでくださり、ありがとうございました!
コメント
カメラだけが動くのですがどうやったらカメラを追尾させることが出来ますか?
syun625のブログの管理者です。
カメラ追尾というのはカメラと頭の動きを同じようにしたい、ということでよろしいでしょうか?
そうであれば、現在新規で作っているプログラムのほうで実装していますので、そちらの記事ができ次第コメントで返信させていただきます。