Unity 2Dゲーム開発日記 4日目 ~基本が~
いろいろあって2週間も空いてしまった。
3日坊主だ。
久しぶりに開いたらいろいろ巻き戻ってた。ちゃんとgithubで管理します。
弾を当てて敵を倒すとのことでしたが...
Unityの2Dゲームで「当たり判定」の基本を30分で理解するコツ!(前編) - Unity不定期便
ここのサイトさんめっちゃ分かりやすかった。めもめも。
当たり判定を使うときは
- OnTriggerEnter2D
- OnCollisionEnter2D
- Physics2D.Linecast
の3つを使うのが一般的らしい。
void OnCollisionEnter2D(Collision2D col){ if(col.gameObject.tag == Tag){ Destroy(gameObject); } }
こんな感じでOnCollisionEnter2Dを使ってみた。
TagにEnemyを入れると、敵に当たったとき、弾が、消えた。
まだ敵が消えないのでEnemyにHPを設定してみる。
void OnCollisionEnter2D(Collision2D col){ if(col.gameObject.tag == Tag){ Destroy (col.gameObject); hp = hp - Bullet.power; if(hp <= 0 ){ Destroy(gameObject); } } }
col.gameObjectが弾で当たり判定ごとに弾の攻撃力をHPから引いていく、HPが0以下になったら敵が消える。って感じになった。
ついでにスコア獲得できるようにしよう。
他のスクリプトのメソッドを実行するには?
今回はScore.csが
using UnityEngine; using System.Collections; public class Score : MonoBehaviour { private int nowScore = 0; void Update () { this.guiText.text = " SCORE:" + nowScore; } public void UpdateScore(int getScore){ nowScore += getScore; } }
こうなってて、UpdateScoreが使いたい。
【Unity】【備忘録】コンポーネント間のメソッド呼び出しとパフォーマンス: 順調に転がってます
ここを参考に。
前調べたのはGetComponentだったけどSendMessageってのもあるっぽい、いいっぽい。使ってみたい。
FindObjectOfTypeってのもあるらしいけど重いからあんまり使わないほうがいいらしい。
score = GameObject.Find ("Score");
からの
score.SendMessage("UpdateScore", Point);
でやってみたんだけどどうなんだろうって感じ。
で、テストしてたら
HP3とかにしても2回当てたら消えちゃうみたいなことに。
なぜだろう。
デバッグで確認すると攻撃力1なのにHPが2減って1回復するみたいな挙動していた。謎。
... 謎じゃなかった。
スライム君にEnemy.csを2つ付けてた!
こんなことにめっちゃ時間取られたー。
ホーム画面を用意したい。
Cmd+nでシーンすぐ作れた。
スタート用の画像を用意して、その画像にScriptをつける。
void Update () { if (Input.GetMouseButtonDown (0)) { Application.LoadLevel ("Play"); } }
こんな感じ。めちゃあっさりできた。
今回終わりにしよ。
次やりたいこと
- 別パターンの攻撃。
- 攻撃モーションとかも付けたい。
やったこと
- 当たり判定系
- 当たったときの動作(HP, 攻撃力, スコアとか)
- 他スクリプトの関数等の使用方法を調べた。
最後にメモメモ
Rigidbody 2Dをまとめてみる
- Mass: 質量
- Linear Drag: 移動の減衰
- Angular Drag: 回転の減衰
- Gravity Scale: 重力
- Fixed Angle: 回転の有無
- Is Kinematic: 衝突時などに移動するか
- interpolate:Physics Update間での補間(動きがぎこちないときとか)
- Sleeping Mode: プロフェッサー負荷を抑えるためのオブジェクトのスリープ方法
- Collision Detection: 他のオブジェクトとの衝突検知の方法
マニュアル: Unity - マニュアル: Rigidbody 2D
デバッグ方法
Debug.Log(value);