敵の目線の動きをUnityで実装する <ゼルダの伝説シリーズ>
かずまです。
前回まではPlayerの動きを実装していました。
ちなみにSwitchのゼルダの伝説の動きが気になる方はこちら。
テーマ
今回のテーマは"敵の動き"です。
敵がいないと始まらないですからね。
考察
敵の動きを見てみます。
気づかれると注目して見られる
音に気づく
目線があうと気づかれる
隠れると見失う
ココらへんが結構重要だと思います。
この章では歩くことはあとで実装します。
Enemyを追加
EnemyをPlayerと同じものを作ります。
前回作ったCharactorControlをつけます。
今度はEnemy.csを作ります。
気づいたときのアクション
EnemyにつけるNoticeObjectを作ります。
気づいたときのびっくりマークとはてなマークをPhotoShopとかIllustratorで作ります。
[びっくり]
[はてな]
両方背景透明なので白く見えますがあります。
Notice.csを作成
先程用意した画像をSpriteにして、SpriteRendererで表示します。
その時につけるスクリプトです。
以下のように設定します。
WarningはHatenaのSpriteを入れて、
DiscoveryはBikkuriのSpriteを入れます。
これをPrefab化して、その後、NoticeObjectに入れます。
ここからは重要な部分だけを取り上げて解説していきたいと思います。
Playerとの距離
Unity C#では
Vector3.Distance (Vector3 a, Vector3 b)
で距離を求めますが、今回は簡単なので実装してみます。
PowはC++でもライブラリがあるみたいなので、ちょっと意識して...
// Enemy.cs Vector3 dv = player.transform.position - transform.position; return Mathf.Pow ((dv.x * dv.x + dv.y * dv.y + dv.z * dv.z), 0.5f);
unitylab.wiki.fc2.com
いや、ここのサイトのように正規化したほうが良さそう。
EnemyはPlayerを探す
EnemyにはSearchメソッドがあって、そこの中でPlayerを探しています。
検索方法としては、
目線
Enemy.cs内でenum設定している
- Warning
これは気づくか気づかないかを表します。
はてなマークのアイコンを使います。
- Discovery
これは気づいたときを表します。
ビックリマークのアイコンを使います。
距離
これは先程、使ったメソッドを使って距離を測っています。
次の足音が小さければ距離が近くても気づかれないです。
入力の力に合わせて足音を実装する
今回はXbox Controllerのスティックを使っているためGetAxisを使うことができます。
float dx = Input.GetAxis ("Horizontal"); float dy = Input.GetAxis ("Vertical"); WalkVolume = (Vector3.right * dx + Vector3.up * dy).magnitude; getWalkVolumeStatus ();
Player.cs内のこの部分でmagnitudeで入力の加減を取っています。
これを足音としています。
スティックを強く押し込むと足音が大きく、軽く押し込むと小さくなります。
VolumeのStatusでどの動きか、を取ることができます。
- Quiet
- Small
- Loud
こんな感じ。
これに音をつければそれっぽくなります。
後半へばってしまいましたが、今回はこんな感じです。
デザインとかも実装したいですがうーん笑
コードのデザインもうまくいかないのでそこまで手が回らなそう。
もっとこうしたらいいよ、みたいなのがありましたら言ってください...!