【unity】3D脱出ゲーム作成_その24

3D脱出ゲーム

カメラを外観周回させる

中身は完成したのでタイトルシーン(シーン名:start)を作成します。room1の外観を写すデザインになります。その1で作った部屋オブジェクト(Probuilder>FlipNormalsで要反転:位置(0, 5, 0))と扉+canvasにタイトル名とSTARTボタン_カメラは斜め上から見下ろす位置にしました。このままだと芸がないので、部屋オブジェクトを中心にカメラを外観周回させたいと思います。カメラに設定する新規スクリプトを作成しましょう。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class start : MonoBehaviour
{
[SerializeField] private Vector3 _center = Vector3.zero;//中心点_(0, 0, 0)
[SerializeField] private Vector3 _axis = Vector3.up;//回転軸_(0, 1, 0) 
[SerializeField] private float _period = 5;//円運動周期
void Update()
{//中心点centerの周りを、軸axisで、period周期で円運動
 transform.RotateAround(_center, _axis, 360 / _period * Time.deltaTime / 2);
 }
public void PushStart(){ SceneManager.LoadScene("room1"); }STARTボタン
}

その2ではカメラを手動で回転させましたが、今回はtransform.RotateAroundを用いて自動回転させています。各係数は[SerializeField]にしてますので軸や周期を増減させ調整してみると良いでしょう。周期を1に近づける程高速回転(初期は約10秒で1周)、軸のxやzを増減させると軸の向きが変わりますのでご注意ください。

カメラを指定点に向ける

続けてゴールシーン(シーン名:goal)を作成します。ここへは前回青マーカー部分で登場したGoalMarkをクリックしたら遷移させます。

外に出れたは良いものの見渡す限り草むら(assetstoreから使用)で途方に暮れるというエンドにしたいので、見渡す+途方に暮れるのをカメラの向きをゆっくり変える事で表現したいと思います。ポイントはA(170,40,240)、B(170,40,-240)、C(300,120,0)、カメラの初期位置は(5,4,4)回転(0,90,0)としておきましょう。

またエンド表示として、canvasにエンドタイトル名とRESTARTボタンを配置して初期はfalse。カメラに設定する新規スクリプトを作成しましょう。

GoalMark:文字は3D>TextMesh
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
using UnityEngine.SceneManagement;
public class goal : MonoBehaviour
{
[SerializeField] Transform lookA;
[SerializeField] Transform lookB;
[SerializeField] Transform lookC;
public GameObject EndClear;
public static bool boneStart;
void Start(){ EndRoll(); }
void EndRoll()
{
 DOTween.Sequence()//Delay調整無しで順番に実行
   .Append(transform.DOLocalMoveX(15f, 9f).SetEase(Ease.InOutQuart))//加減速
   .Append(transform.DOLookAt(lookA.localPosition, 3f))
   .Append(transform.DOLookAt(lookB.localPosition, 3f))
   .Append(transform.DOLookAt(lookC.localPosition, 3f))
   .OnComplete(CompleteFunction);
   boneStart = true;
}
void CompleteFunction(){ EndClear.SetActive(true); }
public void PushReStart(){ SceneManager.LoadScene("start"); }//RESTARTボタン
}

DOTweenのSequenceというものを使用しています。Sequence以下Appendで下に処理追加、OnCompleteでAppendの処理が全て完了した事を検知しています。単体オブジェクトにおいてはほぼコルーチンと同じく非同期処理が可能になる優れものです。

以下デモ

room1のGoalオブジェクトは本来全てのギミックをクリアしたら出現します。

その他

次回はおまけとして二周目限定のギミック(boneStart)+総括で締めくくりたいと思います。

コメント

タイトルとURLをコピーしました