Unity入門：今週悩んだこと。イベントクラスの改良。

##はじめに

今週勉強したことをまとめています。
初めまして、HITOMI(男)です。現在Unityを勉強しています。今週勉強したこと、悩んだことをここに書き残します。
今週はほとんど読み込みクラスの拡張で終わりました。今の段階で一通り遊べる形にはなっています。４月の完成を予定していましたが、ちょっと難しいかなと思います。多分4月15日ぐらいの完成になると考えています。


今週(3月15〜3/20日)詰まったところ。
・イベント管理クラス使用の変更
・カメラについて

##イベント管理クラスの改良、変更について


イベント等を外部ファイルから読み込み、変更できるようにプログラムを書いています。その読み込むフォーマットの記述方法をどうするか、試行錯誤と改良を繰り返していました。

例えば、
ゲーム中ではチェックポイントなどを配置して、そこに到達した場合、何かしらのイベントを追加しようと考えています。
そして今まではこのように書いていました。

```
<EventData name="event04",type="event",next="event05">
<TriggerObject type="box",event="speech",position="5.4,1.0,0.0",size="1.0,1.0,1.0"></TriggerBox>
        <SpeechBubble position="12.4,7.0,0.0",fix="bottom">
            <Speech speech="今なんかイベントが起きています。",interval="0.1",auto="true",autoInterval="1.0"></Speak>
            <Speech speech="どんなインベントなんでしょうか？",interval="0.1",auto="true",autoInterval="1.0"></Speak>
            <Speech speech="楽しみですね。",interval="0.1",waitForInput="Enter"></Speak>
        </SpeechBubble>
    </EventData>

```
このイベントを読み込むと、トリガーにプレイヤーがヒットすると、吹き出しが現れてspeechに書かれている内容が自動で流れます。そして、最後の文章が読み終わった後にエンターキーを押すと終了する。という処理が実行されます。


しかし、吹き出しが出る前に「カメラの視点をプレイヤー向ける」や「イベント中に動作できないようにする。」という処理が必要だと思っているので、今週はこのイベントクラスにカメラや操作制御なども設定できるようにプログラムを拡張していました。

結果として下記のように書くことに変更しました。

```

<EventData name="event01",type="start",next="event02">
        <TriggerObject type="box",event="speech",position="5.4,1.0,0.0",size="1.0,1.0,1.0"></TriggerBox>
        <Camera type="smoothLookAt",position="0.7,7.0,-10.0",target="enemy",time="0.03"></Camera>
</EventData>

<EventData name="event02",type="event",next="event03">
        <Restriction target="player" type="move"></Restriction>
        <SpeechBubble position="12.4,7.0,0.0",fix="bottom">
            <Speech speech="今なんかイベントが起きています。",interval="0.1",auto="true",autoInterval="1.0"></Speak>
            <Speech speech="どんなインベントなんでしょうか？",interval="0.1",auto="true",autoInterval="1.0"></Speak>
            <Speech speech="楽しみですね。",interval="0.1",waitForInput="Enter"></Speak>
        </SpeechBubble>
</EventData>

<EventData name="event03",type="event",next="event04">
       <Camera type="follow",position="0.0,0.0,-6.0",target="Player"></Camera>
</EventData>

<EventData name="event04",type="event",next="end">
        <Restriction target="player" type="all"></Restriction>
        <Fade type="out",time="2.0"><Fade>
</EventData>

```

上記のコードだと以下のような動作となります。
①トリガーにプレイヤーがヒットすると、カメラを「enemy」の方に注視点を移動させます。
②吹き出しで文章を表示させ、プレイヤーを追随する位置にカメラを更新。
③フェードアウトする。
④記述されているイベントを全て終了するとシーン切り替え。


この書き方だとプレイヤーのHPが０になったらゲームオーバーに移行するという処理も、

```
<EventData name="gameover01",type="start",next="gameover02">
        <Trigger type="check",event="gameover",target="player"></TriggerBox>
        //ここにイベントの内容
</EventData>
```
このように追加すればいいだけで、簡単にカスタムができるのではないかなと考えています。
という感じで、データ読み込みの改良をしていました。


このデータはいろんなゲームを作る時に再利用できそうなので、できるだけ納得できるまで作り込みたいと思っています。
ひとまずこれで完成として、後で時間が余った時に「選択肢でイベント先を変更できる」ことも追加しようと思っています。



##カメラについて

今までLookAt()を利用して、注視点を操作していましたが、これを滑らかに移動させたいな。と考えたので滑らかに注視点を移動するカメラのプログラムを試行錯誤していました。

下記のURLで方法が紹介されていたのでこれを改良しました。
https://www.sejuku.net/blog/69635

改良したコードは下記です。

```
Quaternion m_Rotation
void SetCamera(GameObject _targetObj)
{
   Vector3 relativePos = targetObj.transform.position - this.transform.position;
   m_Rotation = Quaternion.LookRotation (relativePos);
}
 
Update(){
   m_Time += m_Speed;
   if(m_Time > 1.0f)
   {
       m_Time=1.0f;
       m_State = //次のステート
   }
   transform.rotation  = Quaternion.Slerp (this.transform.rotation, rotation, m_Time);
}
 
```
こうすることによってタイマーが終わればシーンが切り替わるようになっていますが、ちょっと動きがおかしい・・・
何か見落としている気がする。






##さいごに
以上今週悩んだことです。記述していること以外はほとんどバグチェックでした。プログラムの部分はほぼ完成で、あとは細かい部分の改良で済みそうです。
来週はプログラムが完成して、モデリングに入っているのではないかと思います。