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

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

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

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Unity

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

Q&A

解決済

1回答

529閲覧

全てのrigidbodyに同時に力をかける

qoooooo

総合スコア13

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Unity

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

0グッド

1クリップ

投稿2018/01/04 09:17

###前提・実現したいこと
取得した全てのRigidbodyに同時にAddforceをかけたいです。

###発生している問題・エラーメッセージ
for文でforceを加えているため、順番に力が加わってしまい、うまく動きません。

###該当のソースコード

javascript

1#pragma strict 2static var blastForce = 100; 3static var blastRadius = 100; 4var implode = true; 5 6 7 8function FixedUpdate () { 9 var things : Collider[] = Physics.OverlapSphere(transform.position, blastRadius); 10 for (var i=0; i<things.length; i++){ 11 if (things[i].attachedRigidbody && things[i].attachedRigidbody != GetComponent.<Rigidbody>()){ 12 var offset : Vector3 = (things[i].transform.position); 13 if(0<=offset.x && offset.x<0.1){ 14 offset.x = 0.1; 15 }else if(-0.1<offset.x && offset.x<0){ 16 offset.x = -0.1; 17 } 18 19 if(0<=offset.z && offset.z<0.1){ 20 offset.z = 0.1; 21 }else if(-0.1<offset.z && offset.z<0){ 22 offset.z = -0.1; 23 } 24 things[i].GetComponent.<Rigidbody>().AddForce(blastForce/offset.x, 0, blastForce/offset.z); 25 } 26 } 27} 28

###補足情報(言語/FW/ツール等のバージョンなど)
原点との距離と反比例して力が大きくなっていくようにしています。あまりに距離が近い時は力が無限になるのを防ぐために距離を変えています。

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

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

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

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

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

Bongo

2018/01/04 22:57

本筋とは関係ないかもしれませんが、以前のご質問だと力の大きさは「自身と相手の距離に反比例」だったかと思います。今回は「あるオブジェクトは範囲内の他のオブジェクトに対して力を及ぼすが、その向きは常に原点から離れる向きで、大きさは相手のオブジェクトと原点の距離に反比例する」ということでいいでしょうか。もし、この条件であるオブジェクトに2個、3個のオブジェクトが作用した場合、働く力は2倍、3倍に増す気がしますが、それでも構わないでしょうか。
qoooooo

2018/01/05 01:16

できれば、原点との距離ではなく、自身と取得したオブジェクトとの距離に反比例させたいと考えています。あるオブジェクトに複数のオブジェクトが作用した場合、働く力は足し合わせた力になるようにしたいです。力が増すことに関しては問題なく挙動するのであれば大丈夫です。
guest

回答1

0

ベストアンサー

「1回のFixedUpdate内で同じオブジェクトに複数回力を加えたとき、力を加える順番で結果が変化するか」ということについては、すみませんがはっきりした情報を見つけられませんでした。力を足し合わせる順番によって浮動小数点数の誤差の伝播の仕方が変わり、結果が変わってくる可能性も確かにありそうな気もしますが、今回のケースでもっと影響が大きそうなのは「距離が近い場合の無限大の回避の仕方」のように思います。

力の大きさは「相手と自分の距離に反比例」させるとして、もし2つのオブジェクトがZ軸上に一直線に並んでいたとすると、力のX成分について無限大回避が発生し、このときoffset.xは両者ともに0なので、どちらのオブジェクトもX+方向の力を受けることになり、動きが非対称になるのではないかと思います。

書き換え案として、力の大きさはoffset.magnitudeに反比例させることにして、このときの両者の距離の最低値を0.1にして、力の方向は「自分から遠ざかる向き」...つまりoffset.normalizedの向きにするというのはどうでしょうか?
このやり方で力の向きが不確定になるのは2つのオブジェクトがぴったり同じ位置に重なっている場合ですが、Unityの仕様だと、この場合はoffset.normalizedVector3.zeroになるようですので、力が加わらなくなり対称性は維持されるように思います。

Javascript

1 function FixedUpdate () { 2 var things : Collider[] = Physics.OverlapSphere(transform.position, blastRadius); 3 for (var i=0; i<things.length; i++){ 4 if (things[i].attachedRigidbody && things[i].attachedRigidbody != GetComponent.<Rigidbody>()){ 5 var offset : Vector3 = (things[i].transform.position - transform.position); // offsetを自身との相対位置に変更 6 var direction : Vector3 = offset.normalized; // 相手の方角 7 var magnitude : float = offset.magnitude; //相手との距離 8 if (magnitude < 0.1f){ 9 magnitude = 0.1f; 10 } 11 direction.y = 0; // 方角のY成分を0にする 12 things[i].GetComponent.<Rigidbody>().AddForce((blastForce/magnitude) * direction); 13 } 14 } 15 }

投稿2018/01/05 01:55

Bongo

総合スコア10807

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

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

qoooooo

2018/01/05 02:40

均等に綺麗に広がりました!説明も丁寧にしていただき、ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問