江上宿六です。
ここまで記してきたUnityの操作や処理についておさらいしようと思いました。
理由はブランクのせいで割と記憶から飛んでしまったからです、悲しい。
3頁目:画面、オブジェクトの操作
画面の操作やオブジェクトの生成について書いた頁。
左上のアイコンをクリックして移動や回転などの挙動を選択する事が出来る。
W,Eキーを使うなりして切り替える方が楽な感じかもしれない。
視点の移動はAlt+左ドラッグを覚えておくと良さそうである。
4頁目:インスペクター
インスペクターの説明や、オブジェクトの操作も行った頁。
5,6頁目:スクリプトを書いてみる
実際にスクリプトを書いてみた頁。 5頁ではStart関数やUpdate関数の説明、
スクリプトを実行させるにはオブジェクトにアタッチして使う事などを説明。
6頁目ではオブジェクトを回転させてみたりしてました。
クラス内に回転速度を保持する変数を宣言し、Start関数内で回転速度量を設定。
Update内でtransform.Rotate()を使いオブジェクトをその回転速度分を回転させる
という処理を行い続ける、という感じの事を行いました。
7頁目:マウスボタンの検知
Input.MouseButtonDown(0)で左クリック、(1)で右クリックを検知して、
各方向への回転速度の制御を行ったりしました。
8頁目:ボタンを押したり放したり、という状態の検知
Input.MouseButtonDown()は押した時の状態。
Input.MouseButton()は押し続けている状態。
Input.MouseButtonUp()は離した時の状態。
キーボード入力の検知はInput.GetKeyDown、GetKey、GetKeyUpを使う。
9頁目:パッドとかの操作
パッドのボタンはInput.GetKey(KeyCode.Joystick1Button0)等で取得可能。
スティックはInput.GetAxis("Horizontal")で水平方向、Input.GetAxis("Verticle")で
垂直方向を取得出来、値はそれぞれ-1.0f~1.0fの間となる。
このHorizontaやVerticalというのはEdit→ProjectSettings→Inputから表示される
InputManagerのものを参照しているようで、ここから色々と設定出来る。
TypeがJoystickAxisならば、そこのAxisを変えたりする事で
様々なスティックなどの状態を検知出来るようになるようである。
自分のWiiプロコン用のやつではこのようになっていたと書いておきます。
3rd:右スティックX
4th:右スティックY
5th:十字キーX
6th:十字キーY
10頁目:Prefabと言いつつRigidbody
オブジェクトにRigidbodyを追加する事で物理的な挙動をさせられるようになる。
追加方法はインスペクターのAddComponentからPhysics→Rigidbodyとする。
当たり判定に用いられるColliderとセットで扱われる事が多い。
11頁目:Prefabとインスタンス生成
シーン上にあるオブジェクトをアセットにドラッグする事でPrefabが生成される。
Prefabというのは画面に同じオブジェクトを大量に出現させたいとかいう時に
使えたりするもので、オブジェクトの雛形となる物。
1.生成を制御する為のオブジェクトを生成する
2.スクリプトを生成してそのオブジェクトにアタッチしておく
3.スクリプト内でPrefabの受け皿となるGameObjectをPublicで宣言する
4.Inspectorで先ほどのPrefabを宣言した所にアウトレット接続する
5.スクリプト内でGameObjectを宣言してInstantiateを使う、これによって
Prefabのデータを宣言したGameObjectに受け渡すことが出来る。
6.(変更があるなら)初期状態を設定したりする。 初期位置など。
13頁目:ランダム数
ランダムな値を扱う時の処理です。
Random.Range(a,b)とするとaとbの間の数値が得られる。
floatで(-1.0,1.0)した場合は-1.0~1.0の値が得られるが、intで(-10,10)とした場合は
-10~9までの値が得られ、10は得られないという点には注意。
14頁目:当たり判定
Colliderを使った当たり判定を主に扱いました。
OnCollisionEnter():当たった瞬間
OnCollisionStay():当たり続けている間
OnCollisionExit():離れた瞬間
といった感じで関数が用意されており、それぞれのタイミングで呼ばれます。
同様にOnTrigger~()という関数も用意されていて、OnCollision~との違いは
当たった時にオブジェクトが物理的な挙動を行うか行わないかという点です。
OnCollision~は行われ、OnTrigger~は行われません。
またこの回ではタグを設定して球と床を区別し、処理を分けたりしています。
15頁目:小ネタ回
オブジェクトにマテリアルを設定して色づけをしたり、rigidbody.AddForce()を使い
物理挙動をするオブジェクトに力を加えて飛ばしたりしました。
16頁目:UIの作成
テキストのUIを作成し、アンカーを使って表示位置を設定しました。
インスペクターで色々と設定が出来るので、必要に応じて確認。
17頁目:UIの更新
UIの更新はスクリプトを使って行われます。
using UnityEngine.UIと記述してUIを扱える様にしておくのを忘れずに。
スクリプト内でGameObjectを宣言し、Start関数内でGameObject.Find()を使って
UIのテキストオブジェクトを取得して代入しておく。 Update関数内で
GetComponent<Text>().textに実際表示されるテキスト内容を代入することで
Update関数が呼ばれる度にUIが更新されるようになる。
スコアならばToString()を使って数値を文字列に変換してやると良い。
ToString("D")とすると整数、ToString("F1")とすると小数点第一位まで変換される。
18,19頁目:ゲーム的処理を行う
得点の追加はGameを制御する空のオブジェクト用のスクリプト内にpublicで
関数を作り、オブジェクトが破棄される時にそれを呼び出すようにしている。
その関数を使うためにはGameObject.Findでその制御用オブジェクトを取得し、
GetComponent<スクリプト名>.関数名()とする。 スコア変数の方をpublicにする
という発想は却下。 この辺のデータを表に出すべきではない気がするので。
19頁目でも同様にゲームを制御する関数を作り、呼び出すという事の繰り返し。
面倒くさい関数の使い方をしてるかもしれないけど、多分ベターでしょう。
20,21頁目:シーンの切り替え
行き来するシーンをFile→BuildSettingsのScenesInBuildに登録する。
スクリプトの方はusing UnityEngine.SceneManagementを定義しておき、
SceneManager.LoadScene()で移動先のシーンを指定すればシーンが切り替わる。
21頁目、シーン移動によってオブジェクトが全て破棄されてしまうので
Start関数内でDontDestroyOnLoad()を呼び、破棄されないように設定をした。
これによってオブジェクトは保持されるが、今回はUpdateで既に存在しない
オブジェクトに対して処理を行いエラーを吐いたりしたので値を受け渡したら
破棄しました。 この辺の設計は微妙だと思いました。
22頁目:反省会
サウンドやアニメーションについて書くとか書いてある。 書かねば。
という感じで記していたのを確認しました、何故か数日かかりましたが。
実はこの確認作業でだいぶ勘が戻ってきたというか、思い出してきました。
とは言えあのGetComponent<>の書き方は相変わらず馴染めない感じですけどね。
とりあえずこれで先に進めそうです。
という事で次回は反省会にあった通りサウンド、アニメーションあたりを
やっていきたいと思います。 やらないと忘れてしまうので。