FC2ブログ

記事一覧

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

スポンサーリンク

育成ゲームが作りたい その2 ~キャラクターの生成~

こちらの記事の続き?です

育成ゲームをつくってやる!!

突然ですが、キャラクターを生成してみます!
UI(ユーザーインターフェース、ゲーム操作のために画面に設置されるボタン等のことです)を利用するので
アイテムの使用とか、今後色々なところで応用できそうですね。
Unityの便利機能を使うので簡単です。


まずは必要なものを準備していきます。
下の画像のようにして、「Create」→「UI」→「Canvas」からCanvasを追加します。
※「Panel」,「Button」のどちらかを先に追加した場合、「Canvas」は自動で追加されます。

Unity 161003 1

同じようにして「Create」→「UI」から「Panel」「Button」も追加しておきます。

追加できたら配置を調整してみます。
移動やサイズの変更は普通のオブジェクトと同じようにしてできます。
キャンバス上での位置に応じて同じようにゲームビュー上でも表示されるはずです。

Unity 161003 2

UIの位置はキャンバスからの相対位置(基準とした点からどれだけ離れているか)で指定されています。
基準点は下の画像のようにして変更することができます。

Unity 161003 3

Panelの上にButtonを複数設置して、全て綺麗に収めたい場合はボタンを子オブジェクト化すると簡単です。
動画で紹介しています
よかったらどうぞ。

配置完了!
次にスクリプトを書きます。


C#でスクリプトファイルを作成、ボタンにアタッチしておきます。

キャラクター生成の手順は

・ボタンをクリック
・次にゲーム画面上任意の位置をクリック
・クリックした位置にキャラクターを生成


という感じにしてみたいと思います。

ボタンをクリックした時にスクリプトを実行、というのはUnityのイベントシステムがやってくれるので
実行するスクリプトだけこちらで用意します。


Unity 161003 4


上の画像が今回用意するスクリプトです。
まず public void StartCreate() のところから見ていきます。

キャラクターの生成を実装するにあたって、コルーチンというものを使っています。
そのコルーチンを呼び出すための関数がStartCreate()です。
ボタンクリック→StartCreate()→CreateObj()という流れでキャラクターが生成されます。

StartCreate() 内のStartCoroutine("CreateObj"); というのがコルーチンを呼び出す処理です。
("ここに呼び出したいコルーチン名を書きます")

では呼び出したコルーチンの方を見てみます。
IEnumerator CreateObj() というところです。

コルーチンが呼び出されて最初に実行されるのが

while(! Input.GetMouseButtonDown(0)){
yield return 0;
}

というところですね。
whileは条件式(! Input....の部分)が正である限り繰り返される処理です。
Input.Get.....の前に付いている!には否定の意味があります。
Input.GetMouseButtonDown(0) というのはマウスの左クリックがされたら、という意味です。
これの否定ということになりますから

まとめると「マウスの左クリックが”押されていない”間」繰り返される処理です。

while内の yield return 0; で一時的に処理を止めることが出来ます。
コルーチンで使える便利機能ですね。
(これがないと無限ループで固まってしまいます)

ボタンが押された後、キャラクターを生成したい位置をクリックするまで待機する、という処理です。
yield return で処理を中断している間も他の処理は実行されるので、プレイヤーキャラクターの操作等もできます。

マウス右クリックがされた時、whileを抜けて次の処理に移ります。

screenPos = Input.mousePosition;
gamePos = UnityEngine.Camera.main.ScreenToWorldPoint(screenPos);
gamePos.z = 0;
Instantiate(prefabA,gamePos,Quaternion.identity);


screenPos , gamePos は先に宣言しておきましょう。Vector3型変数です。

まず screenPos = Input.mouse.Position; でマウスがクリックされた位置を取得します。
次に gamePos = UnityEngine.Camera.main.ScreenToWorldPoint(screenPos); で
スクリーン座標をワールド座標に変換します。

(マウスがクリックされた座標はスクリーン上のどの位置かで取得されます。そのままの位置を利用するとゲーム上では全く別の位置になってしまうので、Camera.main.......でワールド座標に変換しておく必要があります。)
(UnityEngineの部分は省略可能ですが、今回Cameraクラスを自分で作ってしまったので指定してあります。)


gamePos.z = 0; でz座標を元に戻しておきます。
z座標がおかしな値になっているとカメラに映らなくなってしまうので気を付けましょう。

最後に Instantiate(prefabA,gamePos,Quaternion.identity); でオブジェクトの生成です。
中身は(生成したいオブジェクト,生成する座標,角度) です。
オブジェクトはインスペクタから追加すると簡単ですね。(詳細は下で)

これでスクリプトは完成!

Unityのほうに戻って、ボタンのインスペクタからいくつか設定をします。

ヒエラルキービューからボタンを選択して、インスペクタのButton (Script)から
On Click () の設定をします。
None(Object)となっている部分に今設定しているボタン自身をドラッグ&ドロップします。
するとNo Functionの部分が選択できるようになるので、「(先程用意したスクリプトファイルの名前)」→「StartCreate()」を選択。
これでボタンがクリックされた時(On Click時)にStartCreate()が実行されるようになりました。
(下の画像で画面説明してあります)

Unity 161003 4




後は生成するオブジェクトを指定するだけですが、少し補足を。
同じオブジェクトを複数扱う場合、プレハブという機能が利用できます。

ヒエラルキービューからプロジェクトビューのアセットへ、オブジェクトをドラッグ&ドロップするとプレハブが生成されます。
プレハブからヒエラルキービューへドラッグ&ドロップで同じオブジェクトが生成でき、スクリプトを使ってプレハブからオブジェクトを生成することもできます。

Unity 161003 4


プレハブが作成できたら、ボタンのインスペクタから生成するオブジェクトを設定しましょう。


Unity 161003 4


以上で完成です。
長くなってしまいました。

ボタンを押して生成位置を指定するとオブジェクトが生成されるはずです。

今回はここまでです。
ありがとうございました。
スポンサーサイト

スポンサーリンク

コメント

コメントの投稿

非公開コメント

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。