坊主アプリを見直し、コードのポイントをまとめていきます。
//tips
//canvasの背景の透明化
Canvas下にUI→image→color(RGB)はあり、その中のAが透明度を表すので値を下げて透明度を上げる。
//UIのtextに縁取りをつけるeffect
UI→Effects→Outline
//GameManagerの作り方
C#スクリプトGameManager.csを作成し、それをcreateemptyで生成したオブジェクトに添付する
定数はpublic class game manager:mononehaviourが宣言されたすぐ後に
private const int MAX_ORB = 10;
などと宣言する。
GameManagerで操作したいオブジェクトは
public GameObject orbPrefab;
public GameObject canvasgame;
として定義する。これによりGameManager上の項目として編集できる。
GameObject型として今回の変数を設定しているので、ヒエラルキーやプロジェクトのオブジェクトを入れる。
//メソッドの作成とプログラム動作への組み込み
プログラム起動時点でのアクション設定
Void Start()
{
for(int i=0;i<MAX_ORB;i++)
{
CreateOrb();
}
}
動作内容のメソッドをVoid Start(),Void Update()には含めないように、さらに下に記述していく。
プレハブからオブジェクトをクローン生成するには下記のように書く。
//クローンであるため型をキャスト変換
GameObject orb = (GameObject)Instantiate(orbPrefab);
これは基底クラスから派生クラスへの型変換のため(GameObject)が必要。
orbPrefabが親でorbが子。
Person p = (Person)obj;
一方で派生クラスから基底クラスへの型変換の場合、見慣れたnewを使った形。
object obj = new Person();
Person()が派生クラスなのはわかるが、objが基底クラスとなるのはいまいちわかりづらい。
これはクラス(設計図)からオブジェクトに影響を与える実体(参照先)を設けるということだと思うが、パターンで覚えた方が良さそう。
//Orbの座標の設定をcanvasに準拠して行う際に、transform.SetParentを使用
Transform.SetParent の第2引数には bool 値を渡すことができ、trueの場合、親のcanvasに関係なくワールド座標で指定することができる。
Falseの場合、ローカル座標系となり、親であるcanvasの座標の影響を受ける。
今回はcanvasを基準にするためfalse
orb.transform.SetParent(canvasGame.transform(親),false);
//UIスコア表示
作成したUItextオブジェクトをGameManagerで操作するため、
public GameObject textscore;
と宣言
TextscoreにGameManagerから与える操作内容として、
private int score = 0;
private int nextscore = 100;
を設定。
これにgetorbメソッドとrefreshscoreメソッドを絡めていく。
public void GetOrb()
{
score +=1;
RefreshScoreText();
}
Getorbメソッドは外部スクリプトから呼び出せるようにpublicを付加。
このメソッドの定義public void~はpublicであるがUnityのGameManagerのインスペクターには項目として現れないもの。
void RefreshScoreText()
{
textScore.GetComponent<Text>().text = “徳:” + score + “/” + nextscore;
}
ここで先に宣言したprivate int score = 0;、private int nextscore = 100;の内容を
GetComponent<Text>()を使い、UI上に記載する内容を操作する。
仮の内容として、徳:99999/99999と入力されているが、void Start()内のRefreshScoreText();で修正するため、この仮の内容がプレイヤーの目に止まることはない。
GetComponentはオブジェクトに不要された属性(コンポーネント)を呼び出し、その項目を操作するもので、基本的には
オブジェクト名.GetComponent<コンポーネント名>().コンポーネント項目変数=操作したい内容
と表される。
//EventTriggerを利用したタッチアイテムの取得
流れとしては、
オーブタッチ→EventTrigger:touchorb呼び出し→orbmanager:touchorbでgetorb呼び出し+オーブ消去→gamemanager:getorbでスコア増加処理し、refreshscoreでスコア表示を更新
この流れを作成するために上記では下流のプログラムから構築している
touchorbをorbmanagerで分けて管理しなければいけないのは、gamemanager自体が実体を持たないから、オーブの実体に関与する分はオーブに紐づいたorbmanagerでしなければいけない。
オーブの実体imageorbにAdd コンポーネントからEvent→EventTriggerを選択し、今回はオーブに触れたことを検知したいのでAdd new event typeからPointerEnterを選び、+から検知機能を付与する対象のimageorbをはめ込むことで、オーブに触れたことを検知する機能を追加する。
No functionの場所にはタッチされた際の処理スクリプトを追加するため、imageorbにセットされているorbmanagerのtouchorb()を呼び出すように設定する。
touchorbメソッドはgamemanagerのgetorbメソッドを呼び出すが、private GameObject gameManager;として宣言したため、GameObject.Find()でScene上に存在するGameObjectの名前をダブルクォーテーションで囲ったものを指定する。
GameManagerの方はpublic Gameobjectとしてプロトタイプ宣言しておき、Inspectorから指定していた違いを認識しておく。
//OrbManager
private GameObject gameManager;
void Start()
{
gameManager=GameObject.Find(“GameManager”);
}
マウスが押されたらgamemanagerのgetorbメソッドを実行するものとすると
public void TouchOrb()
{
if(Input.GetMouseButton(0) == false)
{
return;
}
gameManager.GetComponent<GameManager>().GetOrb();
Destroy(this.gameObject);
}
}
//Input.GetMouseButton()での判定
混乱してしまうInput.GetMouseButton()の記述内容での棲み分け。
if (Input.GetMouseButton(0)) {
print("左ボタンが押されている");
}
if (Input.GetMouseButton(1)) {
print("右ボタンが押されている");
}
if (Input.GetMouseButton(2)) {
print("中ボタンが押されている");
}
if (Input.GetMouseButtonDown(0)) {
print("いま左ボタンが押された");
}
if (Input.GetMouseButtonDown(1)) {
print("いま右ボタンが押された");
}
if (Input.GetMouseButtonDown(2)) {
print("いま中ボタンが押された");
}
if (Input.GetMouseButtonUp(0)) {
print("いま左ボタンが離された");
}
if (Input.GetMouseButtonUp(1)) {
print("いま右ボタンが離された");
}
if (Input.GetMouseButtonUp(2)) {
print("いま中ボタンが離された");
}