ブルーノのC#プログラミング & unity勉強日記

プログラミング素人、ブルーノの自主勉強ノートです。他のプログラミングを勉強したい方の助けになれば幸いです。その他趣味の雑記もしていきたいです

No.002 進捗状況14[人に話しかける挙動]

f:id:covory10101101276:20190508164311j:plain
カッパドキア -トルコ-

みなさんこんにちは🌚

さて今回は以前作ったメッセージスクリプトと組み合わせてゲームのような話しかける処理を実装していこうと思います。

f:id:covory10101101276:20190508164535j:plain
イメージ画像
しかしこの話しかける処理を考えてみたのですがやることが
まず
・会話可能範囲内で対象にカーソルを表示 ←この時複数のキャラが被った場合の処理も考える
そして
・カメラを会話用の位置に移動
・メッセージウィンドウを表示
・キャラ同士を向かいあわせる
と、意外に多いのでとりあえずまだわからないカメラの移動をおいといて他の機能をどうにか実装しようと思います。

カーソルの実装
話しかけることのできるキャラクターをわかりやすくするためにカーソルをまず設けました。
f:id:covory10101101276:20190508210332p:plain
カーソルという空のオブジェクトの子にそれぞれ上部の逆三角錐と下部の円を置いています。地味にこの逆三角錐は初めてのProBuilderで製作したものだったりします。
unity3d.com
最近標準搭載された3Dモデリングツールです。とても簡単!
そしてこれにMessageManagerスクリプトと、対象のオブジェクトに話の内容と位置情報を格納したActiveMessageスクリプトを作成
f:id:covory10101101276:20190508210919p:plain

f:id:covory10101101276:20190508210935p:plain
MessageManagerスクリプト
f:id:covory10101101276:20190508211002p:plain
ActiveMessageスクリプト
ActiveMessageスクリプトは以前作成したメッセージウィンドウのものをちょっといじっただけですがMessageManagerスクリプトは一から書いたためスパゲッティになっています笑笑

わかりにくいので解説するとMessageManagerスクリプトでその名の通りActiveMessageスクリプトを持つオブジェクトを一括管理し、一番プレイヤーに近い会話オブジェクトと同じ座標にカーソルが常にいます。そしてカーソルオブジェクトのトリガー範囲内に入った時だけカーソルが可視化&話すことができるというわけです。製作過程でキャラの範囲が被った場合はどうしようか悩みましたがOnTriggerEnterとExitで実装すると被っている場合でもすんなり処理してくれたのでラッキーでした。そもそも実際のゲームプレイではNPCは離して配置すれば良いだけですしね。

キャラ同士を向かいあわせる
この動きがなかなか大変でした。
数学なんてここ最近ちっともやっていないので一応実装に成功した今でもベクトルだとかQuaternionだとかの理解がちゃんとできていないと思いまする。

f:id:covory10101101276:20190514164741p:plain
向かいあわせる動きをActiveMessageスクリプトに追加
どうしてもお互い向き切った後の角度の参照の仕方がわからなかったので時間で管理しました。一応2秒あればどんな角度でも向けるはずなので問題ないです。実行すると...
f:id:covory10101101276:20190514165115p:plain
お互いに向き合った!!
なんとかできました!!
ずいぶん時間が空いた&リアルが忙しかったですがなんとかまた一つ実装に成功しました。次回以降はいよいよゲームシステムの大枠に移っていきたいと思います。