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

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

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

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

Q&A

解決済

1回答

688閲覧

公転を2周だけさせたい

aro

総合スコア21

Unity

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

0グッド

0クリップ

投稿2020/08/14 08:48

編集2020/08/14 08:53

前提・実現したいこと

Unityにて公転を2周で終了させる方法が知りたいです。
様々な方法で公転させてみましたが、ずっと周り続ける公転しか実現できませんでした。
1周したらカウントをとる方法もわからずです。出来れば、1実行毎に1周の方がシンプルかもしれません。

移動しているキャラの周りを公転しているので、公転の方法によって挙動が変わってしまうので、そこだけ注意してます。

試したこと

RotateAround

以下で公転するオブジェクトを、中心オブジェクトの子にする方法
動きは理想的ですが、半径を指定出来ないのと、出来れば中心の座標から自分の位置を指定したい。
そして2周判定出来ず。

C#

1public class Circle : MonoBehaviour 2{ 3 //中心のオブジェクト 4 private GameObject gObject; 5 //回転のスピード 6 private float speed; 7 8 void Start() 9 { 10 speed = 2.0f; 11 gObject = GameObject.Find("Enemy"); 12 } 13 void Update() 14 { 15 transform.RotateAround(gObject.transform.position, Vector3.forward, speed); 16 } 17 18}

Rigidbody.MovePosition

以下は動きも半径がとれるのも理想的ですが、2周だけというのが実行出来ず…

C#

1void Update() { 2 if (gObject == null) { 3 return; 4 } 5 Vector3 offset = new Vector3(radius * Mathf.Sin(Time.time * speed), radius * Mathf.Cos(Time.time * speed)); 6 rb.MovePosition(gObject.transform.position + offset); 7 }

Quaternion.AngleAxis

以下のサイトを参考にしましたが、これも以下で回転の位置をとってるので、2周だけというのが困難でした…
あと追従しながら回転する時の動きがなんか変でした。

C#

1360 / _period * Time.deltaTime

https://nekojara.city/unity-circular-motion#%E3%82%AF%E3%82%A9%E3%83%BC%E3%82%BF%E3%83%8B%E3%82%AA%E3%83%B3%E3%82%92%E4%BD%BF%E3%81%86

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/08/14 10:44

半径と速度から角速度を計算して周期を求める方法はできませんか?
aro

2020/08/14 10:48

周期を求めるとはどういうことでしょう? 1周でも問題ないです。逆に1周単位で実行出来た方が汎用性があって理想的です。
guest

回答1

0

ベストアンサー

位置で周回数を管理するよりは、一周する時間を出して、
その時間が過ぎたら一周、というようにしたほうが楽そうです
そして1周するのに要する時間のことを周期と呼びます

RotateAroundとRigidbody.MovePosition
では半径と速度から計算が必要ですね

Quaternion.AngleAxisなら
_period がもろに一周の長さなのでそのままつかえますね

投稿2020/08/14 10:54

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

aro

2020/08/14 10:56

RotateAroundでは多分おっしゃってることが実現できました! void Update() { //時間をカウントする countup += Time.deltaTime; if (countup >= 2) { return; } transform.RotateAround(gObject.transform.position, Vector3.forward, 360 * Time.deltaTime); } にすることで、解決しました。Time.deltatimeの仕組みをよく理解出来ておらず、つまづきました。 Rigidbody.MovePositionと、Quaternion.AngleAxisでも出来ましたら解決済みにします。 ちょっとやってみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問