朝一ウォーミングアップ。
シーソー
noscriptだよ。
目次
にわとりくっつけます
Unity4入門 最新開発環境による簡単3Dゲーム製作を参考に制作。
物体いろいろ設置
- くっつき玉(Object)準備
- にわとり飛び去り防止壁作成
- 照明設置
- カメラ位置調整
- 本のにわとりさんをインポート
- 空のオブジェクト(Character)作成
- にわとりさんをCharacterの子にする
※これは親の物理挙動を子が引き継ぐ仕様を利用して、物理挙動等をCharacterに任せ、キャラの差し替えを容易にするため。 - Characterに物理挙動等設定
ここからは初の処理になるので項目分け。
Characterに当たり判定つける
Add Component > Physics > Capsule Collider
後は数値をいじって判定を調節する。
Colliderは全て判定をつけるもの。
今回はCapsuleの形状を選択した。
タグつけ
CharacterのInspectorにあるTag > Add Tag
Sizeで入力項目の数を指定。
Element 0 ~ n にタグの名前を入れる
指定が終わったら
再度Tagクリックし、作成したタグを選択する
Objectにも同様のタグをセットする。
CharacterをPrefab化
プレハブ化したらHierarchyからCharacterを削除する。
作ったプレハブはAssetsに新規フォルダを作ってその中に入れる。
にわとり発射スクリプト(Cannon.js)の作成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#pragma strict var prefab : GameObject; var power : float; function Update () { if(Input.GetMouseButtonDown(0)) { Score.scorePoint++; var bullet = LoadBullet(); //弾丸生成 var ray : Ray = Camera.main.ScreenPointToray(Input.mousePosition); var dir : Vector3 = ray.direction.normalized; bullet.rigidbody.velocity = dir * power; } } function LoadBullet() { var bullet = Instantiate(prefab); // インスタンス化 bullet.transform.parent = transform; bullet.transform.localPosition = Vector3.zero; return bullet; } |
GetMouseButtonDownでボタンを押された時。
引数0は左クリック、1は右クリック。
LoadBullet関数を呼び出す。
カメラから発射するため、
カメラからインスタンス生成。
transform.parentで親階層を定義。
transformはスクリプトを付与したオブジェクトとなるため、カメラが親階層になる。
基本位置はVector3.zero。zeroで親(カメラ)からの相対位置となる。
returnはJavaと同じなので関数内で定義したBulletの情報を返す。
変数ray(Ray)にマウスカーソルの位置情報を代入。
Camera.ScreenPointToRay()で引数の座標からレイを飛ばす処理をしている。今回の引数はマウスの入力位置。
変数dirはray.direction.normalizedで方向ベクトルをVector3(3次元座標)に置き換える。
velocityは速度。つまりdirのベクトルにpowerの数値を掛けた勢いでbullet(prefab(今回はにわとり))を射出する。
ちなみに最初に定義した変数prefabとpowerはGUIから設定が可能。
フロー
- カメラの位置ににわとり生成
- クリック位置からレイを飛ばす
- レイをベクトルから座標に置き換える
- にわとりをクリック座標からpowerを掛けた分飛ばす
にわとりの落下判定(落ちたら消す)をする
地面を作る。
Mesh Rendererを消す。見た目が消える。
Box ColliderのIs Triggerにチェックをつけてすり抜け可能にする。
※通過判定は残る。
Add Component > New Scriptでにわとり消す用のjsファイルを作成。
1 2 3 4 5 |
#pragma strict function OnTriggerEnter (col:Collider) { Destroy(col.gameObject); } |
OnTriggerEnterはTrigger接触検出。
Collision検出とほぼ同様のため、こちらを参照のこと。
くっつき玉にくっつく処理を加える
Characterを実体化して新しいjsファイルを付与。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#pragma strict private var myJoint:CharacterJoint; var force:float; var torque:float; function OnCollisionEnter (col:Collision) { if(col.gameObject.tag=="Bullet") { if (myJoint==null) { myJoint=gameObject.AddComponent("CharacterJoint"); myJoint.connectedBody = col.rigidbody; myJoint.breakForce = force; myJoint.breakTorque = torque; } } } |
CharacterJointでラグドール効果を設定します。ラグドール効果とはRigidbody同士を接続する効果です。
connectedBodyで衝突したcolに接続し、
breakForceでforceに(GUIで)設定した値の力が掛かるまで分解されず(接続したまま)、
breakTorqueでtorqueに(GUIで)設定した値の回転が掛かるまで分解されないようになります。
つまりタグBulletがついたくっつき玉とにわとり、またはにわとり同士がくっつくようになるわけです。※強い力がかかると離れます。
タイトルを出す
新しいシーンを作って
GUI TextureをCreateする。
好きなテクスチャを貼って色をつけて背景にする。
GUI TextをCreateしてタイトルを入力。好きな大きさ、色に調整する。
GUI Textにゲームシーン(main)に移動するスクリプトを書く。
1 2 3 4 5 6 7 |
#pragma strict function OnGUI () { if( GUI.Button(Rect(Screen.width / 2 -100,230,200,30),"GAME START")) { Application.LoadLevel("main"); } } |
GUI.Buttonを押すとmainに飛ぶ。
第二引数は文字列。
完成!
にわとりぶらさがり
玉にくっつけるとスコアが増えるよ。
落とすと減るよ。
コメント
No Trackbacks.