質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

3回答

3985閲覧

Unity2Dの見下ろしRPGにおける会話方法

DII

総合スコア11

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2019/05/12 21:37

前提・実現したいこと

unityで現在見下ろしマップのRPGを作っているのですが
NPCとの会話に苦戦しておりまして、質問をさせていただきます。
NPCと会話するときに、会話する方法のいいアプローチを探していて
教えていただけると助かります

試したこと

幾つか試した方法としては
enum{主人公の向き}を取得(十字キーを押したときにenumも代入する)
主人公にコライダー(小さく主人公の前方に必ず来るようにした主人公の目の前にしか触れないコライダ4つ、enumに対応し真偽値でON,OFF)を作り
村人に四角い村人と同じ大きさのコライダーを設置
そして、OnCollisionStay(2DのゲームなのでCollision2Dだったかな…?)、つまり主人公のコライダーと村人コライダーが触れている間に
Aボタンを押すと、会話イベント(スクリプト)が呼ばれる…という状態を作ったのですが
一度触れた後にどこでもAボタンを押すと村人と会話できてしまいます…(触れる前にAボタンを押しても反応はない)

おそらくコライダーを利用しないやり方のほうが、簡単に作れるのではないかなぁと思っていて
できればいい方法を教えていただきたいと思っています。
(RPGを作る予定なのでコライダーはゲーム性には必要なくタイルマップコライダーのみで良いため)

この間まで、Unityで作っていたのですが、色々Assetなどを入れたり試していたらかなりごちゃごちゃになってしまったため
一から作り直す予定なので、できれば新しく簡単で合理的な方法を教えてください。
よろしくお願いします。

補足情報(FW/ツールのバージョンなど)

バージョンunity 2018.3.8です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

Unity以外でも言える事ですが、見下ろし型のゲームなら四角形(AABB)の衝突判定を使用するのがベターなやり方です。その場合、主人公の向きを判定するにはベクトルの内積計算をすればよいので、そんなに難易度は高くないと思います。
疑似的ですがこのように組めば良いかと思います。

if AABB(player,NPC){ //45度までなら許容する。 if( vector2_dot(player,NPC) >= 0.707){ 会話イベント(); } }

投稿2019/05/13 01:08

stdio

総合スコア3307

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

DII

2019/05/13 01:26

えっと…すいません。あまり数学が得意ではなく…初心者なので 四角形(AABB)を調べたのですが、難しいですね… vector2_dotというものがあるのですね。 あまりレベル的についていけなくてすいません…。
stdio

2019/05/13 01:51

AABBは衝突判定の中では一番簡単なものですよ。これを難しいと言っているようでは先が思いやられます。「vector2_dot」に関しては関数の名前は適当で、Unityでは下記のURLにリファレンスが乗っています。https://docs.unity3d.com/jp/460/ScriptReference/Vector2.Dot.html ベクトルの知識は貴方がもしUnity以外でゲームを制作する際も役に立ちますとも!! いや、必ずいるといっても過言ではない!!
DII

2019/05/14 10:03

ふむふむ…了解しました。 頑張って勉強してみますね。高校数学はかなりサボっていたためさっぱり覚えていないのですが これを機に勉強してみようと思います。ありがとうございます。
guest

0

ベストアンサー

主人公の向きと座標がわかるなら、目の前に誰かいるかもわかるかと思います。
前方方向をチェックしてそこにNPCがいるなら会話可能みたいにすればOKかと思います。

もしくはNPCとかにTriggerをアタッチしておいて、そのTrigger範囲内にいれば会話可能とすることもできるかと思います。この際、Triggerは会話が可能になるエリアを意味するのでキャラクターの周辺をカバーするように設定します。

投稿2019/05/13 00:44

hogefugapiyo

総合スコア3302

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

DII

2019/05/13 01:22

主人公の前方のコライダーでチェック、2DのRaycastとかを使ったほうがいいでしょうか? Triggerは使いやすそうですね…もう一度、組みなおしてみます わかりやすかったです、ありがとうございます。
hogefugapiyo

2019/05/13 04:41

どういうスタイルで作っているかにもよるのですが、よくある2D のマス目になっているものであれば、マスそれぞれに座標を持っているかと思うので単純にプレイヤーの向きと座標を使ってチェックしてあげるという方法かと思います (プレイヤーが0,0にいて、上をむいているなら調べる先は0,1の位置 みたいな) Raycast的アプローチとして、キャラの向いている方向にRayを飛ばすのももちろん可能です。 あとは目の前にいなくても近くにいればOKとするなら先述したTriggerなどが利用できるかと思います。
DII

2019/05/14 10:02

ああ!座標に、1マス分の座標をプラスマイナスをして計算すればいいんですね…! なるほど…!ありがとうございます。とりあえずそれを自力で組んでみます。 大変助かりました。
guest

0

そして、OnCollisionStay(2DのゲームなのでCollision2Dだったかな…?)、つまり主人公のコライダーと村人コライダーが触れている間に
Aボタンを押すと、会話イベント(スクリプト)が呼ばれる…という状態を作ったのですが
一度触れた後にどこでもAボタンを押すと村人と会話できてしまいます…(触れる前にAボタンを押しても反応はない)

OnCollisionStay2D は衝突していないと呼び出されないので、コードに問題があるだけではないでしょうか?

おそらくコライダーを利用しないやり方のほうが、簡単に作れるのではないかなぁと思っていて
できればいい方法を教えていただきたいと思っています。

主人公の前に村人がいるかどうかは、主人公と村人の位置座標から計算で出せると思うので、コライダーは使わなくても良さそうですね。

投稿2019/05/12 22:23

nskydiving

総合スコア6500

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

DII

2019/05/13 01:18

座標も使うといいんですね。 とても勉強になります。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問