kazumalab tech log

流行りとリラックマと嵐が大好きです。技術的ログ。

敵の目線の動きをUnityで実装する <ゼルダの伝説シリーズ>

かずまです。

前回まではPlayerの動きを実装していました。



blog.kazumalab.com

ちなみにSwitchのゼルダの伝説の動きが気になる方はこちら。

ゼルダの伝説 ブレス オブ ザ ワイルド

テーマ

今回のテーマは"敵の動き"です。
敵がいないと始まらないですからね。

考察


敵の動きを見てみます。

気づかれると注目して見られる

音に気づく

目線があうと気づかれる

隠れると見失う

ココらへんが結構重要だと思います。
この章では歩くことはあとで実装します。

Enemyを追加

EnemyをPlayerと同じものを作ります。
前回作ったCharactorControlをつけます。

今度はEnemy.csを作ります。


気づいたときのアクション

EnemyにつけるNoticeObjectを作ります。

気づいたときのびっくりマークとはてなマークをPhotoShopとかIllustratorで作ります。
[びっくり]
f:id:kazumalab:20170331001612p:plain
[はてな]
f:id:kazumalab:20170331001727p:plain

両方背景透明なので白く見えますがあります。

Notice.csを作成

先程用意した画像をSpriteにして、SpriteRendererで表示します。
その時につけるスクリプトです。

以下のように設定します。
f:id:kazumalab:20170331002330p:plain

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でどの動きか、を取ることができます。

  1. Quiet
  2. Small
  3. Loud

f:id:kazumalab:20170331013058g:plain

こんな感じ。
これに音をつければそれっぽくなります。

後半へばってしまいましたが、今回はこんな感じです。

f:id:kazumalab:20170331013805g:plain
デザインとかも実装したいですがうーん笑


コードのデザインもうまくいかないのでそこまで手が回らなそう。
もっとこうしたらいいよ、みたいなのがありましたら言ってください...!