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

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

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

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

Unity

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

Q&A

解決済

2回答

1145閲覧

unityで、アタッチされているオブジェクトごとにスクリプト内で分岐したい

tom_honmono

総合スコア22

C#

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

Unity

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

0グッド

0クリップ

投稿2021/05/02 10:50

unityでゲームを作っていて敵キャラを増やしています。敵キャラ一体をたくさんのスクリプトで管理しているので、違う動きをする新キャラを増やすときにたくさんスクリプトをコピーして修正するのがめんどくさいです。

そこでスクリプト内でif文を使って、このスクリプトが何にアタッチされているかを判別して動きを変えたいです。

C#

1if("これがアタッチされているゲームオブジェクト" == "遅いキャラ" ){ 2 足が遅い; 3  } 4if("これがアタッチされているゲームオブジェクト" == "球が早いキャラ" ){ 5 球が早い; 6 }

想像ではこんな感じです。GameObject.Findやthisを使うんですかね?
if文の中の書き方がわかりません。
どうすれば判別できますか? わかる方よろしくお願いします。

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

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

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

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

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

guest

回答2

0

私も初心者なので分かりませんが、
判別自体を無くしてしまうとか?
MonoBehaviorは継承させない方がスマートだったか?

using System.Collections.Generic; using UnityEngine; public class EnemyController : MonoBehaviour { public static List<ICharacter> enemys = new List<ICharacter>(); private void Update() { if (Input.GetKeyDown(KeyCode.Space)) Method(); } void Method() { foreach (var enemy in enemys) enemy.Method(); } }
public interface ICharacter { void Method(); }
using UnityEngine; public abstract class Character : MonoBehaviour, ICharacter { void Start() => EnemyController.enemys.Add(this); public virtual void Method() => Debug.Log("指定なし"); }
using UnityEngine; public class FastCharacter : Character { public override void Method() => Debug.Log("足が速い"); }
using UnityEngine; public class SlowCharacer : Character { public override void Method() => Debug.Log("足が遅い"); }

投稿2021/05/03 04:22

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

tom_honmono

2021/05/03 10:50

ありがとうございます。MonoBehaviourについての知識が足りていないのでまだ完全にはわかりませんが、なんとなくわかりました。もう少し勉強してみます。
guest

0

ベストアンサー

C#

1[SerializeField] private int charaType = 0;

最初にこんな感じにキャラクターを判別する変数を定義して、Editor上で0とか1とか入れます。
(String型で「足が速い」「弾が速い」みたいにしても行けないことはないですが、表記ゆれがあってよくないです)

そしてif文は

C#

1if(charaType == 0 ){ 2 足が早い; 3 } 4else if(charaType == 1 ){ 5 球が早い; 6 }

こんな感じに書くのが良いのではないでしょうか?
もっとスマートなやり方はありそうですが、一番これが簡単だと思います。
※追記 キャラのタイプが沢山ある場合は、if文の部分をcase文に置き換えた方が見やすくて良いです。

投稿2021/05/02 11:33

編集2021/05/02 11:35
icegolden

総合スコア9

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

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

tom_honmono

2021/05/02 16:36

ありがとうございます。このやり方で実装してみます。スマートなやり方があればそれも知りたいので、まだ回答は締め切らないでおきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問