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

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

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

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

スクロール

スクロールとは、ディスプレイスクリーン上において連続的にコンテンツが滑っていくことを指します。

Unity

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

Q&A

解決済

1回答

1822閲覧

Unity タテスクロール障害物競走で、ランダム生成したアイテムを、ランダムな方向に移動させたい

Kageyama_23457

総合スコア21

C#

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

スクロール

スクロールとは、ディスプレイスクリーン上において連続的にコンテンツが滑っていくことを指します。

Unity

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

0グッド

0クリップ

投稿2020/01/17 09:21

編集2020/01/18 02:49

ランダム生成したアイテムを、それぞれランダムな方向に移動させたい

Unity、C#ともに初心者なので、至らぬ点あるかと思いますがご容赦ください。
Unityの3Dモードで、タテスクロールの障害物競争のようなゲームを作っています。
具体的に書くと、「自機キャラがいて、他に3人ほどCPUがいて、ゴールを目指す。
途中、①障害物(当たり判定使用)、②加速アイテム(一定時間速くなる)、そして③アビリティアイテムがある。
アビリティアイテム→取るととそのキャラごとの必殺技が使えて、他キャラへの妨害などができる。
CPUも障害物を避けたり加速アイテムやアビリティアイテムを狙ってきたりする。」といったところです。

この度は、ランダムに生成した加速アイテムの移動について質問致します。

現在実装しているスクリプト

①アイテム生成担当のオブジェクト(空のオブジェクト)につけているスクリプト
x、yともランダムな場所に加速アイテムが出てくれます。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class ocha : MonoBehaviour 6{ 7 public GameObject ochaPrefab;//なんのプレハブを量産するのか 8 private float interval;//何秒ごとに生成するのか 9 private float time = 0f;//経過時間 10 11 void Start() 12 { 13 interval = 1f;//何秒ごとに生成するのか設定(1秒ごと) 14 } 15 16 void Update() 17 { 18 time += Time.deltaTime; 19 20 if (time > interval)//経過時間が生成時間になったら(1秒たったら) 21 { 22 GameObject ocha = Instantiate(ochaPrefab);//お茶を生成する 23 float x = Random.Range(-8f, 8f);//x軸上限はとりあえず8。見切れたり逆に狭かったら訂正 24 float y = Random.Range(-4f, -200f);//y軸マイナス最大値はとりあえず200。ゴールよりむこうに出るようなら訂正 25 ocha.transform.position = new Vector2(x, y); 26 time = 0f;//経過時間初期化 27 } 28 } 29}

②大量生産するアイテム(プレハブ)につけるスクリプト
ご教授頂き、0度〜360度の中からランダムに方向を決め移動させることができました。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class ocha03 : MonoBehaviour 6{ 7 private float Speed=1;//なぜかここをどれだけ大きくしても速くならないので、下の☆で掛け算してます 8 private bool nonVisibleAct;//映ってなくても動いてる 9 10 Rigidbody2D rb = null; 11 private SpriteRenderer sr = null; 12 13 void Start() 14 { 15 rb = GetComponent<Rigidbody2D>(); 16 sr = GetComponent<SpriteRenderer>();//自身が画面に映っているか判断 17 18 float angle = Random.Range(0, 360);//0度〜360度の中からランダムに角度(方向)を取得 19 float rad = angle * Mathf.Deg2Rad;//取得した角度をラジアン角に変換(数学ワカンナイデス) 20 21 double addforceX = Mathf.Sin((rad) * Speed); 22 double addforceY = Mathf.Cos((rad) * Speed);//上の2行で取得した方向をaddforceに代入 23 Vector2 moveVector = new Vector2((float)addforceX, (float)addforceY);//Vector2(速度)をaddforceから取得 24 25 rb.velocity = moveVector*4;//☆インスタンスに速度を渡す 26 } 27}

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

■作業環境
Mac Sierra10.12.6(8GB)
Unity2018 4.14f1

■ここまで出来ていること
・プレイヤーキャラクターのアニメ遷移
(待機時:歩いている→下キー入力:走る(手足の動きが早くなる))
・プレイヤーキャラクターの下と左右の移動。上に行く必要はないので、上キーを入力しても動きません。
・カメラのプレイヤー追従(y軸のみ)
・障害物の生成
(車です。このページの加速アイテムと同様にランダム生成後、左右どちらかに走ります)
・CPUキャラの自走(y軸下に向けて進むだけですが)

前回、同じゲームで、「加速アイテムに制限時間をつけたい」と質問し、
解決に至るご教授を頂いたので、そちらのページも貼っておきます。

同質問者のページ:「加速アイテムに制限時間をつけたい」

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

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

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

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

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

guest

回答1

0

ベストアンサー

Rigidbody2D.velocityを移動に使うのでしたら、
new Vector2()の引数のx軸に正数を渡せば右、負数なら左、y軸に正数なら上、負数なら下への移動速度を作り出してくれるので、
乱数生成メソッドでx軸、y軸毎に一定範囲の負数、正数を作り出してみるとかはどうでしょうか。

追記
角度を使った移動方法ですが、この記事辺りではどうでしょうか。
【Unity2D】角度と距離からベクトルを作ってAddForceする【Vector2】

更に追記
Kageyama_23457さんが紹介したページで得たい部分は角度と速度でVettor2Dで生成された移動結果だと推察しますので、座標生成で行ってた部分をこれに置き換えればいいのでしょうはないでしょうか。

C#

1・・・ 2public class ocha02 : MonoBehaviour 3{ 4 public float Speed;//インスペクタで移動速度を設定 5 private bool nonVisibleAct;//映ってなくても動いてる 6 7 Rigidbody2D rb = null; 8 private SpriteRenderer sr = null;//変数宣言 9 10 void Start() 11 { 12 rb = GetComponent<Rigidbody2D>();//インスタンス取得 13 sr = GetComponent<SpriteRenderer>();//自身が画面に映っているか判断 14 15 float angle = Random.Range(0, 360); //角度360度をランダムで得たいので乱数で生成する 16 float rad = angle * Mathf.Deg2Rad; //角度をラジアン角に変換 17 18 //rad(ラジアン角)と移動速度から移動用ベクトルを作成 19 double addforceX = Math.Sin((rad) * Speed; 20 double addforceY = Math.Cos((rad) * Speed; 21 Vector2 moveVector = new Vector2((float)addforceX, (float)addforceY); 22 23 //速度に生成された移動用ベクトルを渡す 24 rb.velocity = moveVector; 25 } 26}

動作確認はしていませんが、こんなとこでどうでしょう。

投稿2020/01/17 13:56

編集2020/01/18 02:06
yureighost

総合スコア2183

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

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

Kageyama_23457

2020/01/18 00:37

yureighost様 ご教授ありがとうございました。上記の通り8方向をランダムに取得し移動させることができました。ただし上記の通り、360度の中からランダムに取得し移動させる方法も知りたいので、解決済みにはせず引き続きアドバイスを募集させて頂きたく存じます。ご容赦頂けますでしょうか。
Kageyama_23457

2020/01/18 01:39

リンク先を参考に以下のスクリプト(ほぼ丸写し)をつけましたが、 ・アイテムが移動しない ・VRでエラーが出ませんが、Unityコンソールに「NullReferenceException:Object reference not set to an instance of an object」と表示されます ```C# using System.Collections; using System.Collections.Generic; using UnityEngine; public class ocha03 : MonoBehaviour { private bool nonVisibleAct;//映ってなくても動いてる Rigidbody2D Rigidbody2D = null; private SpriteRenderer sr = null; float angle = 70; float distance = 1500; void Start() { sr = GetComponent<SpriteRenderer>();//自身が画面に映っているか判断 Rigidbody2D rigidbody2d = transform.GetComponent<Rigidbody2D>(); float rad = angle * Mathf.Deg2Rad; double addforceX = Mathf.Sin((rad) * distance); double addforceY = Mathf.Cos((rad) * distance); Vector2 shotVector = new Vector2((float)addforceX, (float)addforceY); Rigidbody2D.AddForce(shotVector); } // Update is called once per frame } //360度実験スクリプト ```
Kageyama_23457

2020/01/18 02:35

お手数おかけ致しました。おかげさまで360度ランダムが実装できました。 ただ、どういうわけかSpeedの初期値をどれだけいじっても速くならなかったのと、 頂いたスクリプトに脱字があったので(Mastf.Sin〜とMathf.Cos〜が、どちらもfが抜けていてかつ終わりの)がなかったので)、そちらを修正したものを上記②に書かせて頂きました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問