Unity、C#初心者です。
とあるオブジェクトを回転しようとして、
this.transform.Rotate(0,1,0);
として、意図通り毎フレームY軸回転したのですが、
ネットなどで調べてみると
this.transform.Rotate(new Vector3(0,1,0));
となっています。
当然こちらも同じように動作するのですが、
何が違っているのか分かりません。
毎フレームnewしているように思えるのですが、
これはどんどんvector3が生成されて何かメモリ?の無駄使いのようにも思えます。
初心者でオブジェクト指向の基本自体理解できていないように思いますが、
何卒ご教示いただければ幸いです。
よろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
意味としては一緒です。
何が違うのかというと、Rotate(数字,数字,数字)
とRotate(Vector3)
は厳密に言えば違うメソッドです。
使用する際に便利なように引数の型が違うメソッドを用意しています(オーバーロードと言います)。
例えばRotate(数字,数字,数字)
しか無かった場合、Vector3型の各値を渡したい時は
Rotate(vec.x, vec.y, vec.z)
とする必要があります。面倒臭いですね。
なのでRotate(vec)
でもいいように作っています。
で、メモリと速度を確認したところ、どちらの方式もほぼ同じようです。
恐らくいずれの方法もRotate内部での型変換が行われている為かと思います。
(Unity 5.6.5f1 にて Rotate(0,1,0)、Rotate(new Vector3(0,1,0))、Rotate(Vector3.up) をそれぞれ10000000実行。ProfilerのGC Allocで確認)
今回の場合は「お好きな方法で」となりましたが、メモリについて気にすることは大事です。
自分の環境でも確認してみると良いかと思います。
投稿2018/02/04 01:40
総合スコア11427
0
sakura_hanaさんの意見に同意。
Vectorを引き受けるやつだけだとやり辛いことがあります。
なのでオーバーロードという機能を使って intを3つでもいいようにしているのでは?
( 順番が逆かもしれないけど。 )
内部では intを3つ引き受けるやつも new Vectorしているはず。
で、
C#
1this.transform.Rotate(new Vector3(0,1,0));
での new Vector はメモリ常駐しますが、C言語やC++はGC ( ガーベージコレクタ ) がないので、プログラマが破棄しないといけませんが、
C#, Javaといった言語は GC が備わっているのでメモリリークはありえない。
C#では絶対にメモリリークは起きないとは言えないようですが、生成できていれば、GCが管理するらしいので、この場合はメモリリークは起きないらしいです。
( sakura_hanaさんからのご指摘を受けたので編集しました。 )
よって、問題ないと思われる。
投稿2018/02/04 01:46
編集2018/02/04 03:10総合スコア4958
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/04 03:06
2018/02/04 03:20
2018/02/06 00:47
0
お二人からご回答のあったように、お気になさる必要はないかと思います。Vector3の生成に関して、マニュアルによると
Types that are stored directly and copied during parameter passing are called value types. These include integers, floats, booleans and Unity’s struct types (eg, Color and Vector3). Types that are allocated on the heap and then accessed via a pointer are called reference types, since the value stored in the variable merely “refers” to the real data. Examples of reference types include objects, strings and arrays.
直接的に格納され、パラメータ渡しの際にコピーされる型は値型と呼ばれます。これには整数、浮動小数点数、ブール値や、Unityの構造体型(例えばColorやVector3)も含まれます。ヒープ領域に格納され、ポインタによりアクセスされる型は参照型と呼ばれ、変数に格納されている値は単に実際のデータを「参照」しているだけです。参照型の例としてはobject、string、配列などが含まれます。
とあり、Vector3は値型に分類され、不要になればすぐ破棄されてしまうと考えられます。ですので「どんどんvector3が生成されて」とおっしゃるような、Vector3の残骸がどんどん増えていく事態にはならないものと思われます。
投稿2018/02/04 02:00
編集2018/02/04 02:03総合スコア10807
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/06 00:44
2018/02/06 01:03
2018/02/06 01:35
2018/02/06 05:21