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

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

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

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

Q&A

解決済

3回答

13214閲覧

Rigidbodyコンポーネントは使うべき?はずすべき?

mappli15

総合スコア12

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

1グッド

0クリップ

投稿2016/08/31 13:23

編集2016/08/31 14:40

Unityで操作キャラクタや、敵キャラクタなど、衝突判定や重力処理、加えていくらかの
物理挙動をさせたいけれど、かといって、完全に物理挙動を適用はしたくない(ぶつかったときに、回転とかは困る)というケースはかなり普通のことだと思うのですが、

こういう場合、Rigidbodyコンポーネントを適用したうえで、スクリプトなどで制御したほうがいいのか、

あるいは、いっそRigidbodyを最初から使わずに、スクリプト書いたほうが速いんでしょうか?

どちらのほうが定石というか、一般的に好まれるんでしょうか?

質問に不備があるとご指摘いただき、今後は気を付けます。。。
それで、ちょっと情報を追加いたします。
以下のように、敵キャラクタのスクリプトを書いた場合、
Constraintsを使うと、衝突して吹っ飛んで回転などは抑えられるのですが、
LookAt()による回転は抑えられないようで、プレイヤーと衝突するとめり込んで
浮き上がって回転します。。。どうしたらよいでしょうか?

lang

1using UnityEngine; 2using System.Collections; 3 4public class Enemy : MonoBehaviour { 5 private Animator anim; 6 public Transform player; //プレイヤーを代入 7 public float speed = 3; //移動速度 8 public float scope = 15; //敵の知覚範囲 9 // Use this for initialization 10 void Start () { 11 player = GameObject.FindGameObjectWithTag("Player").transform; 12 anim = GetComponent<Animator>(); 13 } 14 15 // Update is called once per frame 16 void FixedUpdate () { 17 18 19 if (getDistance()<scope) { 20 21 anim.SetBool("Tracking", true); 22 transform.position = transform.position + (getDirection() * speed * Time.deltaTime); 23 transform.LookAt(player); //プレイヤーの方を向く 24 } 25 else 26 { 27 anim.SetBool("Tracking",false); 28 } 29 } 30 31 float getDistance() 32 { 33 Vector3 playerPos = player.position; //プレイヤーの位置 34 Vector3 relativePlayerPos = playerPos - transform.position; //敵から見た相対位置 35 return relativePlayerPos.magnitude; //距離 36 } 37 38 Vector3 getDirection() 39 { 40 41 Vector3 playerPos = player.position; //プレイヤーの位置 42 Vector3 relativePlayerPos = playerPos - transform.position; //敵から見た相対位置 43 return relativePlayerPos.normalized; //単位化(距離要素を取り除く) 44 45 } 46} 47
search_search👍を押しています

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

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

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

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

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

guest

回答3

0

ベストアンサー

**「どのような動き方をさせたいのか」**によります。

例えばマリオやモンハンのような「物理挙動に見えるけど実際は物理的ではない動き(物凄く高い位置から落ちてもバウンドしない、何とぶつかっても弾かれる飛距離が同じ等)」をする場合、Rigidbodyは当たり判定のみに用いて(=isKinematicをオンにして)、動きは自分で作った方が狙った見た目にしやすくなります。

一方、コインゲームのような「自然な物理挙動をする必要がある動き」の場合は、素直にRigidbodyの物理演算を用いた方がいいです(というか自前の計算で行おうとしたら大変なことになります)。

負荷も考慮するとRigidbodyは極力付けないに越したことは無いのですが、衝突判定をする以上は必ず必要になってくるので、そこは設計次第となるでしょう。

サンプルのソースコードでは、Lookatは一定距離内なら常時発動になっているので、プレイヤーの方を向き続けるのは当然です。(Constraintsは物理演算による回転を封じるだけなので、スクリプトによる回転はそのまま受け付けます)
回転も封じたいなら、「衝突している間(あるいは衝突して一定時間)はLookatを呼ばない」という処理を挟む必要があります。

投稿2016/09/02 06:48

sakura_hana

総合スコア11425

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

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

mappli15

2016/09/04 10:07

回答ありがとうございました! 計算負荷を考えても、Rigidbodyは付けないほうがいいのですよね。 Rigidbodyは付けずに、Colliderによる衝突判定のみを利用して行く方向で行こうと思います! ありがとうございました!
guest

0

詳しくないので、定石があるかどうかは分かりませんが、せっかくUnityを使っているのだから、素直に Rigidbody を使ったら良いのではないでしょうか。

実行速度についてはあまり考えたことはないので分かりませんが・・・

回転とかは困る

ということであれば、別に自前でスクリプトを書かなくても、Constraits で回転を封じてしまえば良いだけのような気がします。

(ご参考)UnityのRigidbodyとColliderで衝突判定

投稿2016/08/31 13:52

pi-chan

総合スコア5936

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

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

mappli15

2016/08/31 14:45

Constraintsだけでは、ちょっと上手くいきません。。。 質問を編集して、スクリプトを載せたので見ていただけると嬉しいです。 LookAt()による回転は物理挙動によるものではないから、抑えられないということだと 思うんですが、それだったら、結局回転制御のために色々書かねばならず、 Rigidbodyがどれほど役立つのか、、、と思ったりもします。。。
guest

0

プログラミングとは直接関係なさそうなので、ここでは歓迎されない質問だとは思いますが、
Freeze Rotationを設定すればいいのでは?

Unity - スクリプトリファレンス: Rigidbody.freezeRotation

InspectorのConstraintsから設定できますよ。

Unityに関しては、こういうところで聞いてみては?
Unityで困ったときに質問できる場所まとめ - テラシュールブログ

スクリプトの書き方であれば、ここ(teratail)で聞くのもいいと思います。

投稿2016/08/31 13:43

Mr_Roboto

総合スコア2208

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

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

mappli15

2016/08/31 14:18

回答ありがとうございます! 質問が場違いでした。。。すみません。。。 今後気を付けます。。。 ですが、今回だけ甘えさせてもらうと、、、 Constraintsで回転を抑えると、なぜかキャラクタ同士がめり込むようになったり、 めり込んだ際に、相手の姿勢が回転したり、、、(これは多分物理挙動じゃないから抑えられない?)結構使いづらいというか、内部ではどう処理してるんでしょう・・・?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問