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

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

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

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

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Unity

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

Q&A

解決済

2回答

1925閲覧

スクリプト内のみで左右を判別する方法が知りたい。

y0shida

総合スコア15

C#

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

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Unity

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

0グッド

0クリップ

投稿2020/07/04 17:57

前提・実現したいこと

スクリプト内のみで左右を判定し、左にいる敵のみ画像を右向きにしたい。
元となるprefabは一種類しかない。

元のprefabを右向きと左向きの二種類にすることで解決はしていますが、数行のコードで楽に書けるならそっちのほうが面白なと思ったので質問しました。

該当のソースコード

C#

1public class EnemySpawn : MonoBehaviour 2{ 3 public GameObject prefab; 4 5 //時間間隔の最小値 6 public float minTime; 7 //時間間隔の最大値 8 public float maxTime; 9 //敵生成間隔 10 private float interval; 11 //経過時間 12 private float time; 13 14 void Start() 15 { 16 //時間間隔を決定する 17 interval = GetRandomTime(); 18 } 19 20 void Update() 21 { 22 23 //時間計測 24 time += Time.deltaTime; 25 26 if (time > interval) 27 { 28 GameObject enemyRight = Instantiate(prefab); 29 GameObject enemyLeft = Instantiate(prefab); 30 //出現位置をランダム化 31 enemyRight.transform.position = new Vector2(Random.Range(11f, 15f),0f); 32 enemyLeft.transform.position = new Vector2(Random.Range(-11f,-15f),0f); 33 //経過時間を初期化して再度時間計測を始める 34 time = 0f; 35 //次に発生する時間間隔を決定する 36 interval = GetRandomTime(); 37 } 38 } 39 40 private float GetRandomTime() 41 { 42 return Random.Range(minTime, maxTime); 43 } 44}

試したこと

座標で0よりマイナスにいる場合、ローカルスケールを変更して右向きにしましたが
元のprefabが一つだけなので 右でスポーンする敵も右向きになる ので 意味はありませんでした。

private void FixedUpdate() { if (prefab.transform.position.x > 0) { prefab.transform.localScale = new Vector2(-0.5f, 1f); } }

補足情報

元のprefabを右向きと左向きの二種類にすることで解決はしていますが、数行のコードで楽に書けるならそっちのほうが面白なと思ったので質問しました。
↓解決したコード

public GameObject rPrefab; public GameObject lPrefab; if (time > interval) { GameObject enemyRight = Instantiate(rPrefab); GameObject enemyLeft = Instantiate(lPrefab); //出現位置をランダム化 enemyRight.transform.position = new Vector2(Random.Range(11f, 15f),0f); enemyLeft.transform.position = new Vector2(Random.Range(-11f,-15f),0f); }

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

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

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

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

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

guest

回答2

0

ベストアンサー

生成位置のxが0以下であれば反転させるって感じでいいんですかね?
それなら下記でできます。

C#

1/// <summary> 2/// [回転板] キャラの生成 3/// </summary> 4void SpawnWithRoate() 5{ 6 // ポジションをランダムで取得 7 var pos = new Vector3(Random.Range(-2f, 2f), 0, 0); 8 // 回転を決定 posのxが0以下の場合 180度回転させる 9 var rotation = Quaternion.Euler(0, pos.x < 0 ? 180 : 0, 0); 10 // prefabから生成 11 Instantiate(prefab, pos, rotation); 12}

ちなみにSpriteRendererですか?
それならFlip Xにチェックを入れるだけで良いので回転させる必要はありません。
イメージ説明

コードで書くと下記のような形です

C#

1/// <summary> 2/// [SpriteRenderer版] キャラの生成 3/// </summary> 4void SpawnWithSpriteRenderer() 5{ 6 // ポジションをランダムで取得 7 var pos = new Vector3(Random.Range(-2f, 2f), 0, 0); 8 // prefabから生成しSpriteRendererを取得 9 var spriteRenderer = Instantiate(prefab, pos, Quaternion.identity).GetComponent<SpriteRenderer>(); 10 // posのxが0以下の場合 flip x を trueにする 11 spriteRenderer.flipX = pos.x < 0; 12}

サンプル作ってみました

今回のコードを含めたサンプル作ってみました。もし良ければ見てみてください。
FlipTest.unitypackage

イメージ説明

投稿2020/07/05 11:17

編集2020/07/05 11:20
IShix

総合スコア1729

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

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

y0shida

2020/07/05 20:13

わざわざ作ってもらってありがとうございます。 FilpXで反転できるのは知りませんでした。 回答ありがとうございます。
IShix

2020/07/06 07:22

すみません。1点伝え忘れていました。 transform.localScaleはオブジェクトのサイズです。 回転させる時はtransform.rotationを使ってください。 またtransform.rotationはインスペクタ上ではオイラー角(度数法)で表記されていますが、スクリプトから変更する際はジンバルロックを防ぐ為にクォータニオン(四元数)で回転を与える仕様となってます。といっても簡単でQuaternion.Eulerでオイラー角から変換すればいいだけです。 例) Yを90度回転させる transform.rotation = Quaternion.Euler(0, 90, 0);
y0shida

2020/07/06 20:02

追加でありがとうございます。 今度やるときはそれでやってみます。
guest

0

スクリプト内のみで左右を判定し、左にいる敵のみ画像を右向きにしたい。

質問に書いてあることから推測したことは以下の通りです。

  1. 2D ゲームである
  2. 「左右」とは、「"プレイヤーのX座標 < 敵のX座標" の場合 "敵が右にいる" とする。そうでない場合は "敵が左にいる" とする。」という意味の「左右」である
  3. カメラは回転しない
  4. 「敵」のスプライトは左を向いている

以上を前提にしますが、これらが推測通りでない場合、以下は正しくありません。

スクリプトを作って「敵」のプレハブにアタッチし、Start()内で「プレイヤーのオブジェクトを取得し、自分のX座標 < プレイヤーのX座標だったらlocalScaleのXを-Xにして画像を反転させる」処理を書くとよいと思います。

以上では出現時のみ「向きを修正する」ので、出現後も向きを制御したいなら Update() の中で常にプレイヤーとX座標を比較して右向き・左向きを制御すればよいでしょう。

投稿2020/07/04 18:25

bboydaisuke

総合スコア5308

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

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

y0shida

2020/07/05 20:11

ごめんなさい、説明不足でした。 推測通りです。 スポーン側で処理したかったのですが、やっぱり敵そのものにスクリプトつけなきゃいけないみたいでした。 回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問