Unity で 2DRPG 作りに奮闘してます。
今回は、これまで作成してきたゲーム(猫の冒険)で修正したい部分が出てきたので、少しずつ修正してみました。
修正したい部分
修正したいものを以下の表にまとめてみました。
現状 | 修正案 |
---|---|
ジョイステックや会話ボタンがメッセージダイアログに重なる | 会話中は非表示にする |
会話ボタンをクリックしないと会話できない | 接触したら会話 |
会話中もNPCが動いてしまう | 会話中は動かない |
会話してないのに近寄ると振り向いてしまう | 会話するときのみ振り返る |
NPCがお互い移動中に重なり合ってしまう | NPCが重ならないようにする |
NPCが移動できないエリアをすり抜けてしまう | 移動可能エリアを設ける |
コントローラがメッセージウィンドと重なり邪魔です。
修正後の会話処理
会話中はメッセージウィンドウが消えるように修正しました。
動画をアップロードしました。
www.youtube.com
設定メモ
移動できエリアを設定
NavMeshModifierで移動エリアの設定を行います。
a1026302.hatenablog.com
会話中はジョイスティックを非表示にする処理を追加
会話開始時にコントローラーを非表示にして、会話終了時にコントローラを表示する処理を追加する。
IEnumerator Talk() { SetController(false); // コントローラ非表示 GameManager.instance.dialogActive = true; flowChart.SendFungusMessage(message); yield return new WaitUntil(() => flowChart.GetExecutingBlocks().Count == 0); SetController(true); // コントローラ表示 GameManager.instance.dialogActive = false; }
NPCが重ならないようにする
NPCとしてゲームオブジェクトにNavMeshAgentコンポーネントを追加する。
AddComponent > Navigation > Nav Mesh Agent
会話中は動かない設定
NPCとPlayerの距離を算出して指定した閾値を超えた場合移動しないようにする。
// Playerが近づくとNPCが止まるための処理 float now = Vector2.Distance(transform.position, playerObj.transform.position); if(!GameManager.instance.dialogActive) { if (distance < now) { rigidBody.position += input * SPEED; //NPCの移動 } } else{ // NPCがplayerに振り向くための処理 Vector2? vector = new Vector2( (transform.position.x - playerObj.transform.position.x) * -1, (transform.position.y - playerObj.transform.position.y) * -1 ); this.animator.SetFloat("x", vector.Value.x); this.animator.SetFloat("y", vector.Value.y); }