🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Unity

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

Q&A

解決済

1回答

492閲覧

円と四角の動きを交互に行いたい

rekutasu

総合スコア13

Unity

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

0グッド

0クリップ

投稿2020/12/01 03:55

やりたいこと

オブジェクトを円運動と四角の動きを交互に行いたい。
(追記:xz軸平面での移動です。)

円運動のはじめの位置にコライダー(tag:move)を用意している。
このタグにぶつかると円運動から四角形の動きに変更したい。
イメージ説明

分からないこと

現在コードを下記のようにしているが、Updateへ書いていないためか実行されない。
しかしUpdateでif文を使用し分岐を試みたが、実行されなかった。

もし簡単に分岐をする方法があれば、ご助言頂きたいです。

C#

1 void OnTriggerEnter(Collider other) 2 { 3 4 //接触したオブジェクトのタグが"move"のとき 5 if (other.CompareTag("move")) 6 { 7 if (count == 1) 8 { 9 tyoho(); 10 count = 0; 11 } 12 else if (count == 0) 13 { 14 Circle(); 15 count = 1; 16 } 17 } 18 } 19 public void Circle()//円運動 20 { 21 x = radius * Mathf.Sin(Time.time * speed); 22 y = yPosition; 23 z = radius * Mathf.Cos(Time.time * speed); 24 25 transform.position = new Vector3(-x, y, -z); 26 count = 1; 27 } 28 29 public void tyoho()//長方形の動き 30 { 31 while (true) 32 { 33 if (count_tyoho == 0) 34 { 35 // transformを取得 36 Transform myTransform = this.transform; 37 // ワールド座標を基準に、座標を取得 38 Vector3 worldPos = myTransform.position; 39 worldPos.x = -2.0f; // ワールド座標を基準にした、x座標を-2に変更 40 worldPos.y = 0.0f; // ワールド座標を基準にした、y座標を0に変更 41 worldPos.z = 2.0f; // ワールド座標を基準にした、z座標を2に変更 42 myTransform.position = worldPos; // ワールド座標での座標を設定 43 count_tyoho = 1; 44 continue; 45 } 46 else if (count_tyoho == 1) 47 { 48 // transformを取得 49 Transform myTransform = this.transform; 50 // ワールド座標を基準に、座標を取得 51 Vector3 worldPos = myTransform.position; 52 worldPos.x = -2.0f; // ワールド座標を基準にした、x座標を1に変更 53 worldPos.y = 0.0f; // ワールド座標を基準にした、y座標を1に変更 54 worldPos.z = -1.0f; // ワールド座標を基準にした、z座標を1に変更 55 myTransform.position = worldPos; // ワールド座標での座標を設定 56 count_tyoho = 2; 57 continue; 58 } 59 else if (count_tyoho == 2) 60 { 61 // transformを取得 62 Transform myTransform = this.transform; 63 // ワールド座標を基準に、座標を取得 64 Vector3 worldPos = myTransform.position; 65 worldPos.x = 2.0f; // ワールド座標を基準にした、x座標を2に変更 66 worldPos.y = 0.0f; // ワールド座標を基準にした、y座標を0に変更 67 worldPos.z = -1.0f; // ワールド座標を基準にした、z座標を-1に変更 68 myTransform.position = worldPos; // ワールド座標での座標を設定 69 count_tyoho = 3; 70 continue; 71 } 72 else if (count_tyoho == 3) 73 { 74 // transformを取得 75 Transform myTransform = this.transform; 76 // ワールド座標を基準に、座標を取得 77 Vector3 worldPos = myTransform.position; 78 worldPos.x = 2.0f; // ワールド座標を基準にした、x座標を2に変更 79 worldPos.y = 0.0f; // ワールド座標を基準にした、y座標を0に変更 80 worldPos.z = -2.0f; // ワールド座標を基準にした、z座標を-2に変更 81 myTransform.position = worldPos; // ワールド座標での座標を設定 82 count_tyoho = 4; 83 continue; 84 } 85 else if (count_tyoho == 4) 86 { 87 // transformを取得 88 Transform myTransform = this.transform; 89 // ワールド座標を基準に、座標を取得 90 Vector3 worldPos = myTransform.position; 91 worldPos.x = 0.0f; // ワールド座標を基準にした、x座標を0に変更 92 worldPos.y = 0.0f; // ワールド座標を基準にした、y座標を0に変更 93 worldPos.z = -2.0f; // ワールド座標を基準にした、z座標を-2に変更 94 myTransform.position = worldPos; // ワールド座標での座標を設定 95 count_tyoho = 0; 96 break; 97 } 98 99 } 100 }

試したこと

Update内で円運動を行ってみた。

C#

1 void Update() 2 { 3 4 x = radius * Mathf.Sin(Time.time * speed); 5 y = yPosition; 6 z = radius * Mathf.Cos(Time.time * speed); 7 8 transform.position = new Vector3(-x, y, -z); 9 10 } 11

Time.timeはフレーム毎に増加するのでUpdate内でしか、実行できないのかもしれない。

参考にしたサイト
円運動に関するサイト
https://uni.gas.mixh.jp/unity/circle.html
Time.timeのカンファレンス
https://docs.unity3d.com/ScriptReference/Time-time.html

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

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

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

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

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

guest

回答1

0

ベストアンサー

二種類なら、普通にboolで良いんじゃないでしょうか?

C#

1bool b; 2 3void OnTriggerEnter (/*省略*/) { 4 //true false 切り替え 5 b = !b; 6} 7 8void Update () { 9 if (b) { 10 Circle(); 11 } else { 12 tyoho(); 13 } 14}

こんな感じで。

投稿2020/12/01 04:04

PinoMatcha

総合スコア368

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

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

rekutasu

2020/12/01 04:30

ご助言ありがとうございます。 円運動のあとに衝突判定で停止することができました。 そのあとに四角形の動きを行いたいのですが、tyoho()ではうまく実行できませんでした。 もしよろしければアドバイスを頂けないでしょうか。
PinoMatcha

2020/12/01 04:50 編集

コードです。 ▼▼▼▼▼▼▼▼▼▼▼ using UnityEngine; public class Rectangle : MonoBehaviour { // 空のGameObjectを作成し、インスペクタからそのオブジェクトを設定してください [SerializeField] private Transform[] positions; private int count = 0; // 目的地との距離(この数値より近くなると次のポイントへ) [SerializeField] private float dis = 0.1f; // 動く速さ [SerializeField] private float speed = 5f; // Update is called once per frame void Update() { Rectangle(); } void Rectangle() { transform.position = Vector3.Lerp(transform.position, positions[count].position, Time.deltaTime * speed); if (Vector3.Distance(transform.position, positions[count].position) < dis) { count++; if (count >= positions.Length) count = 0; } } } ▲▲▲▲▲▲▲▲▲▲▲ 改造して使ってください。 たぶん動きます。
rekutasu

2020/12/01 05:12

コードまで用意していただきありがとうございます。 自分にまだ知識が足りない部分もありますが、頑張って実行したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問