Unityと黒猫

Unityの備忘録。一緒に勉強しましょう。

「Unityちゃんとクイズしようよ!」の作成備忘録3

 

yamasho69.hatenablog.com

今回からはそれぞれのシーンで備忘録として残しておきたい処理などを書いていきます。 

 

UnityScene

フェードイン・フェードアウトをさせるには

本作はユニティちゃんのキャラクターモデルを使用しますので、

ユニティちゃんライセンス条項を遵守し、

UCLロゴ、またはライセンスを表示する必要があります。

unity-chan.com

本作はTitleScene内にTextでライセンスを表示を行っていますが、

練習も兼ねて、起動時にUCLロゴを表示するUnitySceneを作成し、

フェードアウトして、TitleSceneに切り替わる処理をしています。

 

materializer.co

自分は上記の記事を参考にいたしましたが、今回の流れは次のとおりです。

    1. Unity-FadeManager をダウンロードします。
    2. ダウンロードしたパッケージをUnityプロジェクトにインポートします。
    3. Assets 内に、naichilab というフォルダができるので、その中にあるフォルダを FadeManager ⇒ Prefabs とたどっていき、FadeManager をヒエラルキーに配置します。
    4. MainCamera等のオブジェクトに以下のStartメソッドを打ち込んだAwakeUnityクラスをアタッチする。

     

void Start(){

       FadeManager.Instance.LoadScene("TitleScene", 0.5f);

すると、Scene開始後0.5秒でフェードアウトして、TitleSceneに遷移します。

なお、FadeManagerを使用する際はクラス先頭の

using UnityEngine.SceneManagement;

という通常のScene遷移時に必要な記述はいりません。

FadeManagerのインスペクター上でDebugModeにチェックが入っていると、

ゲーム中にデバッグ用の表示がされてしまいますので、不要ならばチェックは外しましょう。

 

TitleScene

f:id:yamasho69:20190502232729p:plain

ユニティちゃんがなぜか黒い!

Text、ボタン、背景画像はきちんと表示されるのに、

ユニティちゃんだけがなぜか真っ黒けのシルエットになる怪現象が発生し、

しばらく悩んでいましたが、ヒエラルキー上にライトがないだけでした…。

Unity3DではライトはSceneを作成すると自動的に配置されていますが、

2Dでは自動的に配置されていないので、

3Dのオブジェクトを使用する場合はライトを配置しないとシルエットしか表示されません。

 

背景をスクロールさせるには

TitleSceneではユニティちゃんに歩くアニメーションを設定し、それに合わせて背景が左から右にスクロールしています。

この処理を行うために、今回は以下のように同じ背景画像を2枚左右に並べました。

 

f:id:yamasho69:20190513193928p:plain

そして、2枚ともに以下のスクリプトをアタッチします。

 

public class BackGroundController : MonoBehaviour {

// スクロール速度
public float scrollSpeed = -0.03f;
// 背景終了位置
private float deadLine = -16;
// 背景開始位置
private float startLine = 12.0f;


void Update() {
// 背景を移動する
transform.Translate(this.scrollSpeed, 0, 0);

// 画面外に出たら、画面右端に移動する
if (transform.position.x < this.deadLine) {
transform.position = new Vector2(this.startLine, 0);}
}
}

 

 

 

タイトルを光らせるには

デフォルトのフォントだけだと見た目がしょぼいので、フォントの導入を行うことは以前に強く勧めましたが、ゲームタイトルはもう少し目立たせたいところです。

そこで、キラーンと光るようにしてみました。

https://i.gyazo.com/4b4a9f9743e2b2db9740dc1703519e8b.gif

導入方法は「ShinyEffectForUGUI.unitypackage」をインポートし、 UI オブジェクト(本作の場合はText)に
ShinyEffectForUGUI コンポーネントをアタッチすればOKです。

私はコガネブログさんの記事を参考にしました。

baba-s.hatenablog.com

 

さらにシーン開始から2秒おきに光らせるため以下のShineスクリプトもTextにアタッチしています。

public class Shine : MonoBehaviour {

public ShinyEffectForUGUI m_shiny;

private void Start() {
ShinePlay();
}
void ShinePlay() {
m_shiny.Play(1);
Invoke("ShinePlay", 2.0f);
}

 

ボタンを押してウィンドウを表示させるには

https://i.gyazo.com/50a35b7cd9dda00edc00b7dbf0a604cb.gif

画像のように、始めはシーン上に表示されていないメッセージウィンドウをボタンを押して表示させます。

1.メッセージウィンドウをPanelで作成する。

  Panelの子要素としてTextと×ボタン(画像)を入れる。

2.1で作成したオブジェクトを非アクティブにする(親要素のみ)。

3.CREDIT AND PRIVACY POLICYボタンとメッセージウィンドウ上の×ボタンに以下のスクリプトをアタッチする。

public class Message : MonoBehaviour {

public GameObject startbutton;
StartButton sb;

public GameObject exitbutton;
ExitButton eb;

public bool buttonEnabled = true;//ボタン押下有効

public GameObject MessageWindow;//メッセージウィンドウをゲームオブジェクト型で定義


public void OffWindow() {
MessageWindow.SetActive(false);//オブジェクトを非表示に
startbutton = GameObject.Find("MainCanvas/StartButton");
sb = startbutton.GetComponent <StartButton>();
sb.buttonEnabled = true;// スタートボタン有効
//exitbutton = GameObject.Find("MainCanvas/ExitButton");
eb = exitbutton.GetComponent<ExitButton>();
eb.buttonEnabled = true;// EXITボタン有効
}

 

public void OnWindow() {
if (buttonEnabled == true) {
MessageWindow.SetActive(true);//オブジェクトを表示する
startbutton = GameObject.Find("MainCanvas/StartButton");
sb = startbutton.GetComponent<StartButton>();
sb.buttonEnabled = false;// スタートボタン無効
//exitbutton = GameObject.Find("MainCanvas/ExitButton");
eb = exitbutton.GetComponent<ExitButton>();
eb.buttonEnabled = false;// EXITボタン無効
}
}
}

 4.CREDIT AND PRIVACY POLICYボタンをクリックしたときはOnWindowメソッドを、×ボタンをクリックしたときはOffWindowメソッドを呼び出すようにする。

×は元々ボタンではなく画像なので、ボタンコンポーネントを追加すること。

 

5.CREDIT AND PRIVACY POLICYボタンのインスペクター上の、Messageスクリプト部分に「Message Window」という欄ができるので、そこに1で作成したメッセージウィンドウをドラッグする(画像では他のボタンも設定していますが、必須ではないはず。)。

https://i.gyazo.com/eb49473fef5c012ca865bfff40b0c70e.png

 そのシーンでアクティブなオブジェクトはスクリプト上でFindし、操作することができますが、非アクティブなオブジェクトに関してはスクリプトではFindできないため、public GameObjectとして定義し、今回のようにインスペクター上で設定しなければならないようです。

 本処理については、以下の記事を参考にしました。

freesworder.net

  またbool変数Button EnabledをMessageスクリプトだけでなく、StartButtonスクリプト、ExitButtonスクリプトにも定義し、メッセージウィンドウを開くと、×ボタン以外のボタンが押せなくなるようにスクリプトを書いています。

 そして×ボタンを押して、メッセージウィンドウが消えると同時に、再度タイトル画面の3つボタンが押下できるようになります。