スクリプト
Assetsの中にスクリプトファイルを作ります。場所はどこでもいいですが、Scriptsなどのフォルダを作って入れる方がいいと思います。
今回はキャラのコントローラなのでcharcontrollerにしました。
スクリプトを作ったらユニティちゃんにコンポーネントとして付与してください。
ちなみにここから先の太文字は、スクリプトを書いた後に行うことなので忘れないようにしてください。
後は解説やらどうでもいい話です(笑)
WASDキーで動く
まずはWASDキーでユニティちゃんが動くプログラムを書いていこうと思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class charcontroller : MonoBehaviour { public float mainSPEED; void Start() { } void Update() { 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; } } |
7行目は進むのに使う移動速度用の変数の宣言をしています。
14、15行目は分からないでいいです(笑)。
16行目は、WかSキーが入力されたとき、このスクリプトが付与されているオブジェクトを前の方向に対して移動させます。
17行目は、DかAキーが入力されたとき、このスクリプトが付与されているオブジェクトを右の方向に対して移動させます。
…
ここで気づいた方はいるかもしれませんが、気づけたら鋭いです(笑)。
これじゃあ前と右に行くだけで左と後ろに行かないんじゃないの?
と思うかもしれませんが実はそうじゃないんです。
WとDが入力されたときは普通に進みますが、Sが入力されたときは前方向にマイナス分進んで、Aが入力されたときは左方向にマイナス分進むんです。
私も初めてこれを見たときは何このプログラムと思っていました(笑)
なにせ、if文でせっせこ各キーの設定していたんですから(笑)
話は戻りますが、このプログラムを保存したらインタースペクター内のcharcontrollerの中にMainSpeedというボックスが出てくると思うのでその数値を0.02~0.05くらいにしてください。
思ったよりもスピードが出ます。
マウスで視点を動かす
マウスを動かして視点(カメラの角度)を動かせるようにしていこうと思います。
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 |
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; 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); } } |
8、9行目は、マウスのX、Y座標の感度用の変数を宣言しています。
10行目は、cameraというゲームオブジェクトを入れる変数を宣言しています。
31、32行目は、マウスの動きを数値化してx_Rotation、y_Rotationという変数に代入しています。
33、34行目は、上記の数値に感度をかけています。
35行目は、マウスの横軸の動きに対して、ユニティちゃんが横にくるくる回るといった感じです。
36行目は、マウスの縦軸の動きに対して、カメラが縦にブンブン動くといった感じです。
インタースペクター内のcharcontrollerの中にCameraという項目ができるので右の+を押すか、ヒエラルキー上からドラッグ&ドロップして動かしたいカメラの指定をしてください。
x_sensiとy_sensiの数値は大体3~7がよいと思います。
ちなみにこのカメラを指定する部分に変なオブジェクトを入れるとカメラは動かずに指定したオブジェクトのX軸だけくるくる回ってしまいます。
プログラム初心者の方用に、プログラムの記述の方式を変えたので一応説明しておきます。
さっきまでUpdateという関数の中にプログラムを書き込んでいましたが、それだとのちのちわかりにくくなるので、移動は移動用の関数、カメラはカメラ用の関数で書いてUpdateという関数に各関数を読み込ませています。
詳しくは言いませんが、こっちのほうがプログラムが読みやすいので(笑)。
…
しかし、実際に触ってみると違和感がありませんか?
そうです、カメラが後ろとかあらぬ方向を向きます(笑)
これじゃあロボットみたいな首ですね(笑)
次のページに問題を解決したプログラムがあります。
コメント
カメラだけが動くのですがどうやったらカメラを追尾させることが出来ますか?
syun625のブログの管理者です。
カメラ追尾というのはカメラと頭の動きを同じようにしたい、ということでよろしいでしょうか?
そうであれば、現在新規で作っているプログラムのほうで実装していますので、そちらの記事ができ次第コメントで返信させていただきます。