アトラクションを体験する コウペンちゃんランド#006
コウペンちゃんとアトラクションに乗る
こんにちは、ふにいちごです🍓
今日のテーマはアトラクションです。
コウペンちゃんランドにはいくつかのアトラクションを用意する予定です。
それらのアトラクションに近づくと、アトラクションをコウペンちゃんと楽しんでいる動画が再生され、再生された後また遊園地を散策できるといった仕組みを考えています。
今回はその仕組みを作ったので、先に現在の進捗をお見せしますね。
なんとなんと、コウペンちゃんランドにはホテルよつばという、パーク内ホテルがあるのです!
時間の許す限りコウペンちゃんランドを楽しむことができますね✨
最初に作ったのが、アトラクションではなく宿泊施設なのはどうなの、という疑問はおいておきましょう。
この仕掛けを作るの、実はめちゃくちゃ苦戦したので以下は備忘録コーナーです。
ボタンクリックがそもそもできない
アトラクションにうっかり触れてしまうことも考え、
アトラクションに触れる→UIで再生するかの選択→YESの時ムービーへ遷移
という流れにしています。
このUIでマウスクリックを反応させる方法が、泣きそうなくらいわかりませんでした。
通常、ボタンの設定でクリック時に起動するメソッドを定義しておけばOKなのですが、よく考えてみると私のゲーム画面ではマウスカーソルそのものが出ていませんでした。
そして狙ってボタンをクリックしても、カメラ操作が動いてしまい全然反応しない……。
きっとStarter Assetを使っているからであろうことまでは、予想できたのですが直し方がわからない!
Google先生や、chatGPT、それに新たに購入した参考書籍と格闘しつつもう一度注意深くコンポーネントの中を眺めていると……
なんかそれっぽいの見つけた!
試しに、これらのステータスをオンオフしてみると、無事クリックできるようになりました!
おそらくですが
Cursor Locked→プレイ時カーソルの表示・非表示
Cursor Input For Look→カーソル移動によるカメラの視点移動
ではないかと思います。
私は常時カーソルが出ていても気にならなかったので、今のところはCursor Lockedをオフにし、メニューが出たときにCursor Input For Lookをオフにすることで対応しました。
関連するスクリプトはこんな感じです。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using StarterAssets;
using UnityEngine.SceneManagement;
public class MovStaeter_HotelYotsuba : MonoBehaviour
{
Canvas movUICanvas;
Text massageText;
StarterAssetsInputs playerInput;
// Start is called before the first frame update
void Start()
{
//ゲームコンポーネント取得
movUICanvas = GameObject.Find("MovStarter_Canvas").GetComponent<Canvas>();
massageText = GameObject.Find("MessageText").GetComponent<Text>();
playerInput = GameObject.Find("PlayerArmature").GetComponent<StarterAssetsInputs>();
//メッセージの設定
massageText.text = "よつばホテルに移動する?";
}
// Update is called once per frame
void Update()
{
}
void OnTriggerEnter(Collider other)
{
//UI表示
movUICanvas.enabled = true;
//いったんポーズモードに
Time.timeScale = 0f;
//カーソルによるカメラ移動をオフ
playerInput.cursorInputForLook = false;
}
}
これだと、常時出しておきたいと思っているカメラボタンとかはうまくいかないと思うので、もう少し勉強が必要そうですね。
シーン移動時にTimeLineが再生されない
アトラクション内の動画は新たなシーンとして作成しています。
なので、ユーザーの操作によって
遊園地シーン→ムービーシーン→遊園地シーン
とシーンの遷移が発生します。
遷移自体はWeb上にたくさんサンプルコードが載っていたので、サクッと実装できたんですが、なぜかムービーシーン移動時にTimeLineで設定したアニメーション(というかおしゃべり)が再生されませんでした。
この事象もまた泣きそうになりながら悩んだのですが、上記のコードを読んだ勘のいいあなたはお気づきかもしれません。
TimeScaleを0のまま放置してた……!
そりゃ再生されませんよね。
という訳で、ボタン押下時にTImeScaleを1に戻してあげました。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using StarterAssets;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class UIController : MonoBehaviour
{
public Canvas movUICanvas;
StarterAssetsInputs playerInput;
// Start is called before the first frame update
void Start()
{
//初期はUI非表示
movUICanvas.enabled = false;
//ゲームオブジェクト取得
playerInput = GameObject.Find("PlayerArmature").GetComponent<StarterAssetsInputs>();
}
// Update is called once per frame
void Update() {
}
//はいの時
public void ClickYesButton()
{
//タイムスケールをもとに戻し、ムービーシーンに移動
Time.timeScale = 1f;
SceneManager.LoadScene("MOV_HotelYotuba");
}
//いいえの時
public void ClickNoButton()
{
//タイムスケールをもとに戻し、カーソルでの視点移動再開、UI非表示
Time.timeScale = 1f;
playerInput.cursorInputForLook = true;
movUICanvas.enabled = false;
}
}
ちなみに、ムービシーン側では、ムービーの秒数たった後に元のシーンに遷移するようなコードを書いています
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class HotelYotusba_SceneCtr : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
Invoke("backToMain", 11f);
}
// Update is called once per frame
void Update()
{
}
void backToMain()
{
SceneManager.LoadScene("Youkoso");
}
}
この辺は使いまわしのことを考えて、定数ではなくPlayableDirectorのstateあたりを見て遷移させるように変更したいですね。
また現状では、遊園地散策シーンに戻った時にスタート地点で再開してしまうので、いた場所に戻る処理も考えたいところです。
こうやって文にするとあっさりとして見えますが、正直コウペンちゃんランド建設を諦めそうな位悩みました(笑)
無事に解決できたのは、X(旧twitter)やnote等で応援してくださる方のおかげです。本当にありがとうございます。
まだまだ気になるところは沢山ですが、
とりあえず一区切りとして記録します。
それでは!