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

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

ただいまの
回答率

89.10%

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 5,959

mappli15

score 12

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

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

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

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

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

using UnityEngine;
using System.Collections;

public class Enemy : MonoBehaviour {
    private Animator anim;
    public Transform player;    //プレイヤーを代入
    public float speed = 3; //移動速度
    public float scope = 15; //敵の知覚範囲
    // Use this for initialization
    void Start () {
        player = GameObject.FindGameObjectWithTag("Player").transform;
        anim = GetComponent<Animator>();
    }

    // Update is called once per frame
    void FixedUpdate () {


        if (getDistance()<scope) {

            anim.SetBool("Tracking", true);
            transform.position = transform.position + (getDirection() * speed * Time.deltaTime);
            transform.LookAt(player);   //プレイヤーの方を向く
        }
        else
        {
            anim.SetBool("Tracking",false);
        }
    }

    float getDistance()
    {
        Vector3 playerPos = player.position;    //プレイヤーの位置
        Vector3 relativePlayerPos = playerPos - transform.position; //敵から見た相対位置
        return relativePlayerPos.magnitude; //距離
    }

    Vector3 getDirection()
    {

        Vector3 playerPos = player.position;    //プレイヤーの位置
        Vector3 relativePlayerPos = playerPos - transform.position; //敵から見た相対位置
        return relativePlayerPos.normalized;   //単位化(距離要素を取り除く)

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

0

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/04 19:07

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

    キャンセル

  • 2016/09/05 11:02

    一応補足ですが、Colliderしか無いオブジェクト同士は衝突判定は発生しません。
    どちらか片方にはRigidbodyが必要です。
    http://docs.unity3d.com/ja/current/Manual/CollidersOverview.html

    キャンセル

0

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

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

回転とかは困る

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/31 23:45

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

    キャンセル

-4

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/31 23:18

    回答ありがとうございます!
    質問が場違いでした。。。すみません。。。
    今後気を付けます。。。

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

    キャンセル

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

  • ただいまの回答率 89.10%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる