Unity入門:スクリプトからGameObjectを取得する

Unityにおいて、スクリプトからGameObjectを取得する方法です。

 

スクリプト上から取得するにはいくつか方法があるので、

それぞれ解説していきたいと思います。

 

まず初めにスクリプト上から呼び出すにはGameObject.Findを使います。

使い方は簡単でGameObject.Find(“ゲームオブジェクト名”);

でEditor上の名前からGameObjectを呼び出すことができます。

 

また他の一般的な方法としてはGameObject.FindWithTagを使う方法があります。

こちらの使い方は、呼び出したいObjectにEditor上でタブをつけてあげ、

GameObject.FindWithTag(“タグ名”);で呼び出すことができます。

 

またtagの場合は複数のGameObjectを配列で取得することができます。

GameObject.FindGameObjectsWithTag(“タグ名”);で同じタグが付いた複数のGameObjectを取得します。

 

この2つ、多くの人はGameObject.Find(“ゲームオブジェクト名”)でとると思いますが、

GameObject.FindWithTag(“タグ名”);で呼び出したほうが高速で呼び出すことができます。

ちょっとした小技ですので処理を早くしたい方は覚えておいたほうがいいです。

 

以上Unityにおいて、スクリプトからGameObjectを取得する方法でした。

 

 

Unity入門:コンポーネントをプログラムで追加

Unityにおいてコンポーネントをプログラムで追加する方法です。

 

Unityでコンポーネントは非常に便利なものです。

しかしながら時にこれが原因でエラーが起こることがよくあります。

 

よくあるのは複数のコンポーネントを使用しているGameObjectにおいて、

うっかり必要なものを付け忘れ、それがないためにエラーが起こることです。

 

これはコンポーネントが多くなれば多くなるほど付け忘れは多くなります。

 

その対策として必要なコンポーネントをスクリプト内でつけてあげることです。

これならば自分でわざわざつけることがないので付け忘れがなくなります。

 

コンポーネントをスクリプト側でアタッチするには、RequireComponentを使用します。

 

具体的な使い方は、

 

[RequireComponent (typeof (Rigidbody))]

public class PlayerScript : MonoBehaviour {
       void Update() {
            rigidbody.AddForce(Vector3.up);
       }
}

 

といった具合です。
上のコードの[RequireComponent (typeof (アタッチしたいコンポーネント))]

でコンポーネントをスクリプト上からアタッチすることができます。

 

コードでつけてあげているためEditor上でrigidbodyをつけてあげなくても、

下のようにrigidbodyのメソッドを使用することができます。簡単ですね。

 

またこの方法のもう1つの利点としては複数の人物で1つのゲームを作成するときに非常に有効です。

複数の場合コンポーネントの付け忘れは発見が非常に困難です。

 

ですのでこの方法で1番上にコードを書いてあげれば、他のメンバーに

そのコンポーネントが必要なことを明示してあげることができるためです。

 

以上のようにコンポーネントは簡単にスクリプトからアタッチすることができるので、

またミスも少なくなるのでどんどん活用していきたいですね。

 

以上、Unityにおいてコンポーネントをプログラムで追加する方法でした。

 

Unity入門:prefabをフォルダーから読み込む

Unityにおいてprefabをフォルダーから読み込む方法です。

 

通常Instantiate(Instantiateについてはこちらから)でゲームオブジェクトを作成する際、

生成したいprefabをpublicで指定してドラッグアンドドロップで登録してあげます。

 

しかしこの場合では生成したいものが多い場合だとかなりめんどくさいです。

 

ですので今回はフォルダーから名前を指定し、prefabをゲーム内に生成する

方法を解説したいと思います。ではさっそく解説に入ります。

 

やり方はとても簡単で、まずResourcesと名前を付けたフォルダーを用意します。

 

その中に任意の名前のフォルダーを作り、または直接使用したいprefabを移動します。

いろいろなprefabを直接移動するとごちゃごちゃしとても見にくいので、

用途別に別のフォルダーを作成し、その中に移動したほうがいいです。

 

以上で使用する準備は終了し、スクリプトにおいてprefabは

Resources.Load(“任意のフォルダー/prefab名”)で呼び出すことができます。

例としてのようにResources/person/heroパーソンフォルダーの中の

ヒーローのprefabを使用したい場合は、

Resources.Load(“person/hero”);といった具合で呼び出せます。

この方法のpublicで指定するやり方と比較したメリットとしては、

処理が早い、同じ命名規則のオブジェクトを簡単に呼び出せるなどがあります。

後者についてですが例えばEnemy0からEnemy10までの敵がいて、

それぞれ一体ずつ呼び出したい時には、

for(i=0;i<=10;i++){

        Resources.Load(“EnemyFolder/Enemy”+i);

}

といった具合に呼び出すことができます。こちらならばコードは1行でいいので

とても簡単です。

以上のようにResorces.Loadはとても便利なので、

どんどん使っていきたいですね。

以上、Unityにおいてprefabをフォルダーから読み込む方法でした。

Unity入門:マウスクリックを取得、座標を取得

Unityでマウスクリック及びマウスクリックした座標の取得方法です。

 

マウスのクリック判定は多くの場面で登場します。

ですので今日はコードの実装方法を解説していきたいと思います。

 

1:マウスボタンのイベント実装

 

Unityでは3つのマウスのクリック状態を取得することができます。3つというのは

1:マウスのボタンを押したとき、

2:マウスのボタンが押されているとき(主に押されたままの状態の判定)

3:マウスのボタンが押されなくなった時(つまりボタンが上に上がった時)

の3つです。

 

それぞれ上から順番に

Input.GetMouseButtonDown(num)

Input.GetMouseButton(num)

Input.GetMouseButtonUp(num)

で判別が可能です。

 

(num)についてはこちらも3種類あり、

0->左クリック、1->右クリック、2->ホイールクリック

となっています。

 

ここで1つ使い方の例をコードで書きたいと思います。

例として左クリックされた瞬間に何らかの処理をする時を考えます。

その場合以下のようなコードになります。

 

private void Update()
{
    if (Input.GetMouseButtonDown(0)){
             //何らかの処理
    }
}

 

上記のようなコードで左クリックされた瞬間になんらかの処理を起こすことができます。

とても簡単ですね。

 

2:マウスのクリック座標の取得

クリックされた座標を取得するには、

Input.mousePosition

を使います。

 

上記のコードを呼び出した際、返り値としてマウスの座標を(0,0)から(1,1)までの

画面座標を返してくれます。また型はVector2型ですので注意が必要です。

 

例えばクリックしたx座標がほしい場合はInput.mousePosition.xで取得できます

y座標も同様です。

 

以上がマウスのクリック座標の取得方法です。

 

以上のようなクリックされた時の判定、座標取得は、

PC向けゲームを作る際必ずと言っていいほど使う場面があるので覚えておきたいですね。

 

以上、Unityでマウスクリック及びマウスクリックした座標の取得方法でした。

Unity入門:Scriptにアクセスし、値を取得または変更する、関数を使用する。

UnityにおいてScriptにアクセスし、値を取得または変更する方法です。

 

Unityでは他のゲームにアタッチされているScriptの関数を呼び出すとき、

通常SendMessage (“メソッド名”,引数)を使います。

 

SendMessageはメソッドを呼び出す際とても簡単に実装できるため、

よく使われるところをみます。

 

しかしSendMessageには、

1:2つ以上の引数をもつメソッドを呼び出すことができない。

2:引数に0を渡した際エラーが出る。

(これは0は引数なしと判断され、引数が一致しないと判断されるためです。)

3:処理が重い

のようなデメリットがあります。

 

以上のようなことを考えた時、Scriptに直接アクセスし、

値の変更や取得、メソッドの使用をしたほうがいいことがわかります。

 

ではさっそく解説していきたいと思います。

 

今回は例としてゲームオブジェクトTagetObjectにアタッチされている、

TestScliptにアクセスする方法を考えます。

 

コードは以下のようになります。

public class test : MonoBehaviour {

public GameObject TargetObject;

public TestSclipt testsclipt;

void Start () {

testsclipt=TargetObject.GetComponent<TestSclipt> ();

testsclipt.testvalue=代入したい値;

取得し代入したい変数=testsclipt.testvalue;

testsclipt.TestMethod(引数1,引数2)
}

}

 

説明のため日本語で書かれた部分がありますが、

そこは任意の変数や値に直してください。

 

ここで注目したいのはGetComponent<スクリプト名> ()で、

アタッチされたスクリプトを取得することができる点です。

 

これを使い取得したスクリプト.~で変数を呼び出したり、

メソッドを呼び出すことができます。

 

以上のように特に手間をとらずスクリプトを取得することができるので、

SendMessageでなくこちらを使っていきたいですね。

 

以上、UnityにおいてScriptにアクセスし、値を取得または変更する方法でした。

Unity入門:GuiTextを使う、Scriptで文字を変更する

GuiTextの使い方です。

 

ゲームで文字を表示したい場合例えば現在のスコアや、

残機数などを表示したい場合にとても重宝します。

 

さっそく解説に入ります。

1:GuiTextを用意する。

GameObject->CreateOther->GuiTextから作成します。

 

すると中心に(Game画面に)Textが表示されたはずです。

 

2:位置を調節する。

2014-05-25_112634

上の画像のようにGuiTextのpositionを調節して位置を調節します。

注意する点はGui系のpositionは

画面左下が(0,0)右上が(1,1)となる点です。

 

そのためx,yにマイナス、あるいは1以上を入れた場合は

画面から出てしまい表示されないので注意が必要です。

 

以上のことを考慮しながらTextの表示位置を調節します。

Game画面で位置を確認しながらずらすのがいいと思います。

 

FontSizeが初期の場合0になっていると思うので、

自分の好きな大きさに変更します。

 

以上で表示位置、表示設定の変更は完了です。

 

3:Scliptで表示文字を変更する。

コード例を記載します。

public GameObject Score;

private GUIText scoretext;

void Start(){

scoretext = Score.GetComponent<GUIText> ();

scoretext.text=”変更したいText”;

}

上のコードでtextをscliptで変更することができます。

上の場合呼び出されたと同時に表示するtextを変更します。

 

public で宣言されているscoreには上で作成したGUItextの

をEditor上でドラッグアンドドロップで登録します。

 

GetComponent<GUIText> ()はアタッチされているComponentを

取得するコードです。<>内に取得したいComponent名を記述します。

 

一応例を出しておきます。

たとえばゲームオブジェクトTestにアタッチされているコンポーネントTextCOM

をsclipt上で取得したいとします。

 

その場合は以下のコードで取得することができます。

 

private TestCOM testcom;

public GameObject Test;

void Start(){

testcom = Test.GetComponent<TestCOM> ();

}

 

簡単ですね。

 

次に取得したGUITextのComponentを使いTextを変更しています。

 

scoretext.textにtextを代入することで、

画面に表示されるtextを変更することができます。

 

再生を押して表示されているTextが変更されれば成功です。

またScoreが変更されたときにTextが変更されるようにするには、

変更と同時に.textで変更を代入してあげればいいです。

 

このように簡単にできるのでどんどん活用していきたいですね。

 

ただしUnityの標準GUI系は処理が重いので、

もしNGUIが使える方はNGUIを使ったほうがいいです。

 

NGUIについては後日書きたいと思います。

 

以上GUITextの使い方でした。

Unity入門:スクリプトからゲームオブジェクトを生成する

スクリプトからゲームオブジェクトを生成する方法です。

 

ゲームの進行に応じてゲームオブジェクトを増やすことは多々あります。

例えば特定の条件で敵キャラを追加したり、時間に応じて回復アイテムを

フィールド上に出現させたりなどです。

 

ゲームを作っていく際には必ずと言っていいほど必要な知識であると思うので、

どんどん活用していければと思います。

 

ではさっそく解説していきたいと思います。

 

オブジェクトを生成するには以下のコードを使います。

 

public GameObject targetprefab;

Instantiate(targetprefab, Vector3 position,Quaternion rotation);

まず第一引数には作成したいオブジェクトのprefabを指定します。
 

prefabとはオブジェクトの元となる型のようなもので、

Editor上で 右クリック->Crate->prefab から作成し、

作成したprefabに複製したいオブジェクトをドラッグアンドドロップすることで

そのオブジェクトのprefabを作成することができます。

 

わざわざprefabを作成する利点としては、ゲーム上に一つのものを複数置く場合に

(例えばブロック崩しのブロックなど)有効です。

 

わざわざ一つずつ複製し作る代わりにprefabを1つ作ることで、

画面においていけるので作成に手間がかからないということがあります。

 

またパラメータを変えたい場合などに複数のもののパラメータを一つずつ変える代わりに

prefabのパラメータを変えることですべてに反映されることも利点の一つです。

 

今回の場合作成するobjectをpublicで指定してあげているので、

実際に使う際にはEditor上でスクリプトを選択し作成するGameObjectを指定する

欄が作られているので、そこにドラッグアンドドロップしてあげて適応してください。

 

第二引数は作成する場所をVector3型で指定します。

第三引数には作成するオブジェクトの向かせる向きをquaternion型で指定します。

 

このようにして簡単に作成することができます。

これを活用してどんどん要素を追加していきたいですね。

 

以上、スクリプトからゲームオブジェクトを生成するでした。

Unity入門:音声の使用方法(BGM,単発再生)

Unityの音声の使用方法です。

 

音声はゲームの面白さ、臨場感を左右するといっても過言ではない重要な要素です。

今日はその音声の使い方を説明したいと思います。

 

Unityでは音声を発する側、音声を聞く側という概念で

オブジェクトを分けています。

 

ですので音声をただ鳴らしただけでは音声は再生されず、

聞く側を用意しなければなりません。

 

音声を発する側はAudioSourceコンポーネントをつけ、

聞く側はAudio Listenerrコンポーネントをつけるという具合です。

また 音声自身はAudioClipといいます。

 

では基本的なことは上で述べたので、さっそく具体的な使用例を見ていきましょう。

まずは基本的なBGMを再生する方法です。

 

BGMの再生

1:まず音声を用意します。

音声についてはwav,ogg形式のものが好ましいです。mp3でも再生されますが、デメリットが多いのでお勧めしません。

wavとoggの使い分けはoggは圧縮されているため再生までに時間がかかる、一方wavは圧縮されていないため容量が大きいことがあります。

ですのでBGMのように長く使うものはogg,銃声などすぐに再生し容量が少ないものはwavをお勧めします。

 

2:音声を発する

上で述べたように音声を発するには、AudioSourceコンポーネントをつけなければなりません。

ですので発するObjectにコンポーネント->Audio->Audio Sourceを選択し、アタッチします。

 

AudioSource

 

上の画像のようにアタッチしたAudio Sourceの欄を見ると一番上にaudioclipを登録するところがあるので、

用意した音声をそこに登録します。以上で音声を発する側の設定は終わりです。

 

3:音声を聞く側を設定する

こちらは音声を聞かせたいobject(例えばゲームの主人公や、カメラ)にAudio Listenerを追加します。

コンポーネント->Audio->Audio Listenerを選択すればアタッチできます。

 

UnityではデフォルトでメインカメラにAudio Listenerがついています。

ですのでカメラで音声を拾う場合はこの手順は割愛していただいて結構です。

上の手順が終わったら再生してみましょう。しっかりBGMが再生されていたら成功です。

 

もし音が大きすぎる、小さい、または聞こえない場合は音声ファイル自体を選択し、

3Dsoundにチェックが入っていないか確認してみてください。

 

3DSoundとは音を均一でなく、距離によって大きさを変えるものです。

BGMなどはどの場所でも均一に聞こえるものなので、外してください。

うまく適切な大きさで聞こえれば成功です。

 

銃声などの単発での音声の再生

 

次に単発で音声を再生する方法です。

 

こちらは大体の場合コードでよびだすことが多いので、

ソースコードを見ていきたいと思います。

 

public AudioClip  fire;
public AudioClip  reload;

Update(){

    if(fireを再生する条件){
              audio.PlayOneShot( fire,1f );
    }
    if(reloadを再生する条件){

             audio.PlayOneShot( reload,1f );
    }

}

 

 

音声の単発での再生はaudio.PlayOneShot(AudioClip filename,float volume)を使います。

使用する音声ファイルはEditor上で、該当箇所にドラッグアンドドロップてください。

後ろの引数は再生する音量を0~1で指定します。普通の音量ならば1fを指定します。

 

条件で挟んであげれば満たしたときに再生されるので、銃を発砲した時に再生することが可能です。

 

少し長くなりましたが、実装はとても簡単です。

音声を効果的に使ってゲームをより面白くしていきたいですね。

 

以上でUnityでの音声の使用方法の解説を終わります。