やっと作成した全てのアプリの分解を終えたので、再度アプリ作成に戻っていきます。
Unityの初歩はだいぶわかってきたので、次のステップとしては、いかに適切なツールを使用できるかが勝負になりそうです。
と言うのも、9×9マスの床を設置するのに、コピーアンドペーストで一つずつ座標を手直しして作成するのと、導入したブラシツールでドラッグするだけで床が適切な位置に配置されていくのでは作業効率が100倍程度異なるからです。
これは知識があるかどうかの話になってくるので、事前に作成方法を検証して、知識ストックを増やしていくのがベストになりそうです。
また、そのあとは複数ツール間でのバグが発生するかと思うので、ツールの働き方の理解と取捨選択が必要になります。自前スクリプトで補完する必要が出てきます。
その後、アプリ動作負荷をいかに減らすかの戦いとなります。
//tips
//Random.Rangeで確率を表現する
Random.Rangeを使った確率の考え方は、Random.Rangeでとりうる範囲を母数にし、変数で分子としたい値を設定。
実際にRandom.Rangeを実行して得た値が分子で設定して得た値以上か以下かで確率結果を表現する。
ここではif(dice <= this.ratio)・・・elseで分岐させ、当たりの場合、ハズレの場合を表現している。
int ratio = 2;
void Update()
{
this.delta += Time.deltaTime;
if(this.delta > this.span)
{
this.delta = 0;
GameObject item;
Int dice = Random.Range(1,11);
if(dice <= this.ratio)
{
item = Instantiate(bombPrefab) as GameObject;
}
else
{
item = Instantiate(applePrefab) as GameObject;
}
float x = Random.Range(-1,2);
float z = Random.Range(-1,2);
item.transform.position = new Vector(x, 4, z)
}
}
//制限時間の表示
制限時間を管理するためには下記のような監督スクリプトGameDirectorを準備する。
public class GameDirector : MonoBehaviour
{
GameObject timerText;
float time = 60.0f;
void Start()
{
this.timerText = GameObject.Find(“Time”);
}
void Update()
{
this.time -= Time.deltaTime;
this.timerText.GetComponent<Text>().text = this.time.ToString(“F1”);
}
}
Findで事前に作ったemptyオブジェクトのアクセスを手に入れ、設定した制限時間からフレームごとの時間Time.deltaTimeを減少させ、最終的に、オブジェクトのtext項目にアクセスし、そこに小数点1位までの残り時間を表示させるようにしてある。
//獲得ポイントの表示
獲得ポイントの表示も、制限時間の表示と似ていて監督スクリプトで管理できる。
オブジェクトを取得し、アクセスをする変数と初期ポイントを宣言しておき、
GameObject pointText;
int point = 0;
リンゴを獲得した場合のポイント加算、ボムを獲得した場合のポイント減率のメソッドを追加する。
public void GetApple()
{
this.point += 100;
}
public void GetBomb()
{
this.point /= 2;
}
ここでpublicとしているのは、カゴとリンゴの当たり判定の際に呼び出される必要があるからである。
void Start()
{
this.pointText = GameObject.Find(“Point”);
}
void Update()
{
this.pointText.GetComponent<Text>().text = this.point.ToString() + ”point”;
}
これらを監督スクリプトに記載した上で、当たり判定のカゴのスクリプトに下記の追加を行う。
public class BasketController : MonoBehaviour
{
GameObject director;
void Start()
{
this.director = GameObject.Find(“GameDirector”);
}
void OnTriggerEnter(Collider other)
{
if(other.gameObject.tag ==“Apple”)
{
this.director.GetComponent<GameDirector>().GetApple();
}
else
{
this.director.GetComponent<GameDirector>().GetBomb();
}
}
}
このように、GameDirectorへのアクセスを確保した後、OnTriggerEnterの中で、監督オブジェクトにアクセスした後、そのオブジェクトにアタッチされているGameDirectorスクリプトに入り、GetApple(),GetBomb()のメソッドを呼び出すようにしている。
//時間経過で難易度を変える
時間経過で難易度を変えたい場合、難易度に関わる要素を先に抜き出す。
今回は落下物の生成時間、落下スピード、爆弾の混入割合を難易度に関わる要素とする。
これらを一つずつ管理するのは大変なのでSetparameterメソッドを作成して、簡単に各要素を編集できるようにしておく。
public void SetParameter(float span, float speed, int ratio)
{
this.span = span;
this.speed = speed;
this.ratio = ratio;
}
SetParameter(0.9f, -0.04f, 3);とすると生成時間0.9秒、落下スピードフレームごとに-0.04、爆弾の割合、10分の3となる。
これを時間の経過の段階ごとに設ければいいので、
void Update()
{
this.time -= Time.deltaTime;
if(this.time < 0)
{
this.time = 0;
this.generator.GetComponent<ItemGenerator>().SetParameter(10000.0f,0,0);
}
else if(0<=this.time&& this.time<5)
{
this.generator.GetComponent<ItemGenerator>().SetParameter(0.9f,-0.04f,3);
}
else if(5<=this.time&& this.time<10)
{
this.generator.GetComponent<ItemGenerator>().SetParameter(0.4f,-0.06f,6);
}
}
などと設定していくことができる。
おまけ:
Unity製のiOSアプリをApple Storeに公開する手順や方法まとめの参考
https://qiita.com/sea_mountain/items/ab2c631d0785e653be34
Unityのカメラワークの種類