階段を設置する
高さ調節の為に箱の下に机を配置したのですが、その中に木箱を配置→入手したナイフで木箱を切り分けて階段を設置します。オブジェクトはProBuilderで作成しました。
まずは以下をBoxManagerクラスに追加して処理してみます。
public GameObject StairBefore;//繋がった状態の階段
public GameObject StairAfter;//切った後の階段
public GameObject knife;//箱の中にあったナイフ
public GameObject knifeMove;//切るナイフ
public void StairBeforeClicked()
{
knife.SetActive(false);//箱の中のナイフをクリックしたら、無効にする
knifeMove.SetActive(true);
}
public void StairBeforeClicked()
{
if(knife.activeSelf)//箱の中のナイフが有効の場合
{
Debug.Log("dont have knife");
}
else//有効でない=無効の場合
{//↓ナイフを回転させた為z軸をプラスに移動させてますが、上から下に移動させてます。
knifeMove.transform.Translate(0, 0, 1.0f);//3→2に下移動
StairBefore.SetActive(false);
StairAfter.SetActive(true);//階段が出現
}
}
切ったナイフがそのまま残っているのは置いておいて、一応処理は出来ました。ただここからもう少し応用を取り入れたいと思います。
コルーチンを利用する
コルーチンによって非同期処理を行えます。これを利用すると先程までナイフが下に瞬間移動・それと同時に階段が出現となっていたのが、ナイフをゆっくり下に移動→そのナイフをしまう→階段が出現という順番通りに処理できる様になります。すごく便利なのでこれを利用してスクリプトを修正します。
public GameObject StairBefore;
public GameObject StairAfter;
public GameObject knife;
public GameObject knifeMove;
private Vector3 pos;//ナイフの移動位置の定数追加
public void StairBeforeClicked()
{
knife.SetActive(false);
}
public void StairBeforeClicked()
{
if(knife.activeSelf)
{
Debug.Log("dont have knife");
}
else
{
StartCoroutine(Cut());//コルーチンの呼び出し
}
}
private IEnumerator Cut()//IEnumerator メソッド名でコルーチン処理
{
knifeMove.SetActive(true);//移動
while (pos.y < 3.0f)//3を下回る限りループ
{//新たに取得するposはナイフの回転を考慮に入れてない
pos = knifeMove.transform.position;
knifeMove.transform.Translate(0, 0, 0.01f);
yield return new WaitForSeconds(0.01f);//ナイフをゆっくり0.01ずつ移動
if(pos.y <= 2.0f)//2以下で離脱
{
break;
}
}
yield return new WaitForSeconds(1.0f);//1秒待つ
knifeMove.SetActive(false);//ナイフをしまう
yield return new WaitForSeconds(1.0f);//1秒待つ
StairBefore.SetActive(false);//移動
StairAfter.SetActive(true);//移動
}
以下デモになります。
その他
コルーチンには色々な活用方法があるので、もっと試したいと思います。
スクリプト内でナイフの移動に関して面倒な説明をしています。オブジェクトの初期作成の向きは途中で変更できないのが原因なのですが、解決策は案外簡単でナイフの親として空オブジェクトを作成→ナイフ(子)の向きだけを変える→親オブジェクトを移動させるだけです。これだけで、z座標がy座標だから、、、といった無駄な手間が省けます。教訓としてそのまま残してます。
コメント