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

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

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

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

Unity

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

Q&A

解決済

1回答

1663閲覧

Unityにて、複数のオブジェクトのAddforceを、同じ位置で停止させてるのに、若干のバラつきが出る。

aro

総合スコア21

C#

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

Unity

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

0グッド

0クリップ

投稿2020/04/26 13:35

編集2020/04/26 13:50

前提・実現したいこと

【前提】
・現在チュートリアルのシューティングゲームを改良しています。
・敵機が、1体ずつ出現して、一直線(同一X軸線上)に停止するようにしたいです。
・transformで進めれば、狂いなく同じ位置に停止すると思うのですが、
慣性を働かせたく、停止する位置に、スーッと徐々に減速して止まるようにしたいです。
・そのため、Addforceで前進させ、GetComponent<Rigidbody2D>().velocity = Vector2.zero;で停止させています。

【実現したいこと】
慣性が働いているような、進み方・停まり方で、同一直線状に停止させたい。

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

・しかしVector2.zeroが問題なのか?停止位置にバラつきが出ます。
(下記画像の通り、敵機6体を、一直線に停止させたいのですが、バラついた位置に停止してしまいます。)

該当のソースコード

C#

1void Update() 2 { 3 Rigidbody2D rb = this.GetComponent<Rigidbody2D>(); // rigidbodyを取得 4 Vector2 force = new Vector2(0.0f, -1.0f); // 力を設定 5 rb.AddForce(force); // 力を加える 6 7 8 myTransform = this.transform.position; 9 10 //Y軸が1.7より小さくなったら止める 11 if (myTransform.y < 1.7f) 12 { 13 GetComponent<Rigidbody2D>().velocity = Vector2.zero; 14 } 15 }

試したこと

Lerpなどで、やれば出来そうですが…
もっと、簡易な方法がありそうなので、アドバイスをいただきたいです。

myTransform.y < 1.7fだと、ifに入る数値が、コンマ数秒ずれているようで、それが原因のようです。
しかし、myTransform.y == 1.7fなら同じ位置に停止するかと思いきや、Update関数なので、1.7ジャストの時が無いようで、
今度は停止しません。

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

イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

DOTweenを使えば簡単だと思います。
アセットストアでDOTweenをインポートしてください。
使い方はここがわかりやすいです。
y座標が0のところに止まるだけならこんなふうにかけます。
SetEaseで慣性が働いているように見せられます。https://qiita.com/ryosebach/items/5bd90d4b464b9059f35d

c#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using DG.Tweening; 5 6public class Teratail : MonoBehaviour 7{ 8 void Start() 9 { 10 transform.DOMoveY(0, 2.0f).SetEase(Ease.InOutQuad); 11 } 12}

投稿2020/04/26 14:26

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

aro

2020/04/26 15:09

ご回答ありがとうございます! サンプルGIFを拝見しましたが、理想通りの動きでした! このような手段もあるのですね、とても勉強になりました。使ってみようかと思います。 ちなみにですが、このようなアセットを使用しない場合だと、何で動かすのがセオリーなのでしょうか? やはりLerpで座標を指定して、慣性が働いているっぽく数値を設定するしかないのでしょうか? addforceでは、細かい挙動は向いていないのでしょうか?
退会済みユーザー

退会済みユーザー

2020/04/27 01:27

AddForceは物理シミュレーションなので細かい位置合わせはまず不可能だと思います。 Leapだと下のように作れますが、 https://qiita.com/OKsaiyowa/items/3c234301e7d1f9438881 加速してから減速するというような複雑な処理は面倒です。 DOTweenなら、指定の位置に止まった後、その何秒後にどこへ行くというような処理や、 移動や回転しながら拡大縮小といった処理が簡単にでき、敵の移動以外にもあらゆるところで 使えるのでとりあえず入れてみたら良いと思います。 アセットが使えない状況なら代わりにAnimationCurveを使います。
aro

2020/04/27 18:47

Unityのデフォルトの機能で、正確に加速&原則を表現するなら、AnimationCurveがセオリーなのですね! そして、アセットを利用するならDOTweenが簡単で便利なのですね。 Unityを使わないで、慣性のコードを自分で書くとしたら、どうなるのだろう…との疑問もわいたのですが、それはまた別で質問してみようと思います! この移動を頻繁に利用すると思うので、とりあえず今回はDOTweenでやってみようと思います。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問