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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

2275閲覧

UnityのRigitbodyによる動作の制限をスクリプトで制限することができない。

nnnhhh

総合スコア8

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2018/02/24 15:50

編集2018/02/24 15:58

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
unity 2017.3of3.personalでc#を用いて指定した軸の動きを制限するコードを書いています。RigitbodyのConstrainsの中にあるfreeze positionの項目をスクリプトで操作をしようとしたが、constraintsの部分がエラーになってしまいました。

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

エラーメッセージ move.cs(14,14): Error CS1061: Type `UnityEngine.Component' does not contain a definition for `constraints' and no extension method `constraints' of type `UnityEngine.Component' could be found. Are you missing an assembly reference? (CS1061) (Assembly-CSharp)

該当のソースコード

ソースコード using System.Collections; using System.Collections.Generic; using UnityEngine; public class move : MonoBehaviour { int hit = 0; int loopCounter = 0; Vector3 pos; Vector3 pos2; float kurabeX; float kurabeZ; float kurabeX2; float kurabeZ2; // Use this for initialization void Start () { } void OnCollisionEnter (Collision col){ hit = 1; } void OnCollisionExit(Collision col) { hit = 0; } // Update is called once per frame void Update () { loopCounter = loopCounter + 1; if (loopCounter > 2) { loopCounter = 0; } if (loopCounter == 0) { pos = transform.position; } if (loopCounter == 1) { pos2 = transform.position; } if (loopCounter == 2) { kurabeX = pos2.x - pos.x; kurabeZ = pos2.z - pos.z; kurabeX2 = System.Math.Abs (kurabeX); kurabeZ2 = System.Math.Abs (kurabeZ); } if (kurabeZ2 > kurabeX2) { if (kurabeX > 0) { Debug.Log ("moving to +z"); } else { Debug.Log ("moving to -z"); } rigidbody.constraints = RigidbodyConstraints.FreezeRotationX; } if (kurabeX2 > kurabeZ2) { if (kurabeX > 0) { Debug.Log ("moving to +x"); } else { Debug.Log ("moving to -x"); } } if (kurabeX2 == 0 && kurabeZ2 == 0) { Debug.Log("now stopping"); } if (hit == 1) { } } }

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

unity 2017.3of3.personal

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

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

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

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

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

guest

回答1

0

ベストアンサー

使用しようとしているrigidbodyはUnity 5あたりから廃止された古いプロパティですので、現行のUnityでは使用できないかと思います(使用しようとしても例外が発生するのではないでしょうか)。

一つのやり方としてはGetComponent<Rigidbody>().constraints = RigidbodyConstraints.FreezeRotationX;に置き換える手があるでしょう。
ですが、Update内などで毎秒何十回もコンポーネントを取得するのは非効率的なので、Awake内やStart内で一度だけ取得して、別途用意したフィールドに参照を保持しておく方法がよく使われるようです。

C#

1 // 省略 2 3 // 追加したフィールド名が「rigidbody」だと、同じ名前(古いプロパティの方の「rigidbody」)を 4 // 上書きしているがいいのか...?と警告を出してきます 5 // 意図的に上書きしているのだと表明するため、「new Rigidbody rigidbody;」とするか、 6 // 別の名前を付ければ(たとえば「Rigidbody rb;」)警告は消えるでしょう 7 Rigidbody rigidbody; 8 // Use this for initialization 9 void Start () { 10 rigidbody = GetComponent<Rigidbody>(); 11 } 12 13 // 省略

※ちなみに、その古いrigidbodyは取得したコンポーネントをRigidbody型の基底であるComponent型で返すようなので、そのままではconstraintsが見つからないために、ご提示のエラーメッセージが出たものと思います。

投稿2018/02/24 22:41

Bongo

総合スコア10807

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問