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

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

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

Q&A

解決済

1回答

2551閲覧

2DRPGの会話の実装

zaq13

総合スコア14

0グッド

0クリップ

投稿2018/02/11 09:01

編集2018/02/11 09:02

前提・実現したいこと

現在、unity2Dでrpgを作成しているプログラミング初心者です。
操作キャラとモブの会話をさせたいのですが、接触判定で行き詰っています。
下記のc#のコードでプレイアブルキャラクターをキー入力で操作できるようにしたのですが、colliderでの衝突判定では衝突したオブジェクトに向かって無理やり移動を続けると少しだけめり込んでしまいます。(キーを離すと元に戻ります。)
イメージとしては昔のドラクエやffのようにモブに当たるとその方向にはピクリとも動かないというようにしたいのですが、、、
アセットストアも探しましたが見つかりませんでした。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

void FixedUpdate() //f_posには操作キャラの座標が入ります。 //前方向への移動用スクリプト if (Input.GetKey(KeyCode.DownArrow)) { //移動処理 f_pos.y = f_pos.y - 0.075f } //上方向への移動用スクリプト if (Input.GetKey(KeyCode(UpArrow)) { //移動処理 f_pos.y = f_pos.y + 0.075f; } //右方向への移動スクリプト if (Input.GetKey(KeyCode.RightArrow)) { //移動処理 f_pos.x = f_pos.x + 0.075f; } //左方向への移動スクリプト if (Input.GetKey(KeyCode.LeftArrow)) { //移動処理 f_pos.x = f_pos.x - 0.075f; }

試したこと

反発係数をいじったりはしてみましたが、うまくいきませんでした、、、
colliderとrigidbodyはあくまで物理的な演算を行うもののようで、ある意味非現実的な衝突処理はやりづらいようです。
ほかには、スクリプトで座標を上書きしたりもしてみましたが、やはりめり込みます。
1から自分で実装すると、他のアニメーションやスプライトの管理もあってややこしくなりそうで、、、
collider側で対処できたら楽なのですが。

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

unityのバージョンは5.6.f03?です。

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

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

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

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

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

guest

回答1

0

ベストアンサー

こちらで試したところ、以下の設定でやるとうまくいきましたが、どうでしょうか?

  • プレイヤーのRigidbody2DのCollision DetectionをDiscreteからContinuousに変更
  • 移動にRigidbody2D.MovePosition()を使用する(スクリプト全文は以下の通り)

C#

1public class MoveScript : MonoBehaviour 2{ 3 Rigidbody2D rigidbody2d; 4 5 bool down, up, right, left; 6 7 void Start() 8 { 9 // アタッチしているゲームオブジェクトのRigidbody2Dを取得 10 rigidbody2d = GetComponent<Rigidbody2D>(); 11 } 12 13 void Update() 14 { 15 // 入力を受け取る 16 // (※この処理はFixedUpdate()で行ってはいけない) 17 down = Input.GetKey(KeyCode.DownArrow); 18 up = Input.GetKey(KeyCode.UpArrow); 19 right = Input.GetKey(KeyCode.RightArrow); 20 left = Input.GetKey(KeyCode.LeftArrow); 21 } 22 23 void FixedUpdate() 24 { 25 Vector2 f_pos = transform.position; 26 27 //移動処理 28 if (down) 29 { 30 f_pos.y = f_pos.y - 0.075f; 31 } 32 if (up) 33 { 34 f_pos.y = f_pos.y + 0.075f; 35 } 36 if (right) 37 { 38 f_pos.x = f_pos.x + 0.075f; 39 } 40 if (left) 41 { 42 f_pos.x = f_pos.x - 0.075f; 43 } 44 rigidbody2d.MovePosition(f_pos); 45 } 46}

投稿2018/02/11 12:09

fiveHundred

総合スコア9803

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

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

zaq13

2018/02/13 10:17

返信遅れて申し訳ありません。 回答、ありがとうございます! input~の処理はfixedでは使用してはいけないのですね、、、 勉強不足でした、ありがとうございます。 早速試させて頂きます。
zaq13

2018/02/13 10:47

めり込みませんでした! 移動処理のスクリプトも根本から見直すことができ、本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問