これから、以下のように順番に描画されていくような実装をする方法を、私のオリジナルゲームを使って紹介します。
この実装には、coroutineを使っています。
coroutineについてまとめた記事はこちらをご覧ください。
coroutineの使い方
では、実際に手順を紹介していきます。
まず、私のゲームでは駒を配列で管理していました。
具体的には、駒の数と同じ数の要素をもつ配列を用意し、それぞれの要素の数字にしたがって駒を描画していました。
たとえば、ある駒に対応する配列内の要素が0だったらその駒は透明に、1なら白に、2なら黒に描画されます。
実際のコードが以下です。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PieceView : MonoBehaviour {
private PieceInfo _pieceInfo;
private SpriteRenderer _spriteRenderer;
void Awake(){
_pieceInfo = GetComponent<PieceInfo> ();
_spriteRenderer = GetComponent<SpriteRenderer> ();
}
//色付けをしている。
public void UpdateView(){
switch (_pieceInfo.color) {
case 0:
_spriteRenderer.enabled = false;
break;
case 1:
_spriteRenderer.enabled = true;
_spriteRenderer.color = Color.white;
break;
case 2:
_spriteRenderer.enabled = true;
_spriteRenderer.color = Color.black;
break;
}
}
}
これをもとに、配列の数字を順に変更するスクリプトを書いていきます。
//前半部略
public IEnumerator Sway(){
for(int flag = 1; flag <= 10000; flag ++){
if (flag % 2 == 0) {
for (int k = 1; k <= 11; k++) {
board [11 - k + 1, 10].UpdateView(0);
board [11 - k, 10].UpdateView(theTurn);
yield return new WaitForSeconds (0.04f);
}
}
if (flag % 2 != 0){
for (int m = 1; m <= 11; m++) {
board [0 + m - 1, 10].UpdateView(0);
board [0 + m, 10].TurnPiece (theTurn);
yield return new WaitForSeconds (0.04f);
}
}
}
}
//後半も略
上のポイントについて解説していきます。
まず、メソッドを作る際に IEnumerator
を入れる必要があります。
これは、そのスクリプト内で
yield return new WaitForSeconds();
を使うためです。
この1行を入れることで、for文を実行する中でもflagが1上昇するごとに0.04秒処理をまつことができています。
これがないと、通常for文はかなりの速さで実行されるため、どの駒に色がついたのかを見ることはできないでしょう。
また、今回作ったのは
「ある駒から左に順に駒の色がついてい」というものではなく、「左から右に色がついて行ったのち、右から左にも順に駒の色がついていく、というものです。
これを実現するために、私はfor文で使うflagという変数を奇数と偶数で場合分けし、偶数の時には右から左へ、奇数の時には左から右へ順に描画されていくようにしました。
以上で私の作ったゲームを使った説明は終わります。
今回紹介したのは駒を順に白くしていくという大変地味な機能ですが、これは駒を光らせるのみならず様々な分野でいきそうです。
皆さんも自分の作りたい機能に使えそうであったら使っててください。
ここまでお読みいただきありがとうございました!