今回の内容
今回はドラゴンの作成の第3回目で、完成まで実装を進めます!
※初めての方はこちらから
⇒ 【第1回記事】この連載について
プレイヤーが倒れたら炎を吐かないようにする
前回までの実装では、プレイヤーが倒れたあともドラゴンが炎を吐き続けていました。

仕様的にはこのままと言う手もありますが、今回は吐きやめる形で進めます。
これは簡単で、DragonScript を修正してゲームオーバー時に炎を吐かないようにします。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DragonScript : MonoBehaviour
{
public GameObject Fire;
public bool isDamaged;
void Start()
{
}
void Update()
{
if (isDamaged) Destroy(gameObject);
}
private void OnTriggerStay(Collider other)
{
if (other.isTrigger) return;
if(other.tag == "Player" && !StageControllerScript.isGameOver)
{
// ターゲット位置
Vector3 targetPos = other.bounds.center;
// プレイヤー以外のレイヤマスク
int layerMask = ~(1 << other.gameObject.layer);
// プレイヤー以外を対象にLinecastして、ヒットするかチェック
// ヒットしなければ、炎を吐く
if (!Physics.Linecast(transform.position, targetPos, layerMask, QueryTriggerInteraction.Ignore))
{
if (!Fire.activeSelf)
{
Fire.SetActive(true);
Invoke("DisableFire", 1.0f);
}
}
}
}
private void OnCollisionEnter(Collision collision)
{
if(collision.gameObject.tag == "Player")
{
collision.gameObject.GetComponent<PlayerScript>().isDamaged = true;
}
}
void DisableFire()
{
Fire.SetActive(false);
}
}
プレイヤーの方向を向くようにする
ドラゴンがプレイヤーの向きを向くようにします。
ついでに、炎を吐き終えると元の向きに戻るような仕様とします。
DragonScript に追記して、以下の様にしましょう。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DragonScript : MonoBehaviour
{
public GameObject Fire;
public bool isDamaged;
Quaternion DefaultRot;
void Start()
{
DefaultRot = transform.rotation;
}
void Update()
{
if (isDamaged) Destroy(gameObject);
}
private void OnTriggerStay(Collider other)
{
if (other.isTrigger) return;
if(other.tag == "Player" && !StageControllerScript.isGameOver)
{
// ターゲット位置
Vector3 targetPos = other.bounds.center;
// プレイヤー以外のレイヤマスク
int layerMask = ~(1 << other.gameObject.layer);
// プレイヤー以外を対象にLinecastして、ヒットするかチェック
// ヒットしなければ、炎を吐く
if (!Physics.Linecast(transform.position, targetPos, layerMask, QueryTriggerInteraction.Ignore))
{
if (!Fire.activeSelf)
{
transform.LookAt(other.transform);
Fire.SetActive(true);
Invoke("DisableFire", 1.0f);
}
}
}
}
private void OnCollisionEnter(Collision collision)
{
if(collision.gameObject.tag == "Player")
{
collision.gameObject.GetComponent<PlayerScript>().isDamaged = true;
}
}
void DisableFire()
{
Fire.SetActive(false);
transform.rotation = DefaultRot;
}
}
対象の向きを向く処理
39行目の transform.lookAt で実装しています。
メソッド名の通り、引数の Transform の方向を向いてくれます。
(関連記事)
Transformコンポーネントの便利な関数まとめ
向きを元に戻す処理
DefaultRot に初期状態での向きを保存しておきます。
炎を吐きやめる処理(DisableFire)で、向きを DefaultRot にすることで元に戻しています。
=======================================
一旦これでプロト段階でのドラゴンは完成となるので、Dragon をプレハブ化しておきましょう。

床にスクリプトを追加
さて、今回のテーマのドラゴンとはズレるのですが、ここで1点問題があり、
現状のステージではプレイヤーが落下した後も直進を続けてしまい、クリアが不可能となっています。

そこで床に適用する新規のスクリプトを作成して、
床ごとにプレイヤーが触れたら「右に向く」、「左に向く」、「そのまま進む」を設定できるようにします。
FloorScript を作成して、以下のコードを記述してください。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FloorScript : MonoBehaviour
{
public enum PlayerAction { Default, TurnLeft, TurnRight }
public PlayerAction playerAction;
private void OnCollisionEnter(Collision other)
{
// defaultなら何もしない
if (playerAction == PlayerAction.Default) {
return;
}
if (other.transform.tag == "Player") {
PlayerScript player = other.gameObject.GetComponent<PlayerScript>();
// プレイヤーの移動を開始する
switch (playerAction)
{
case PlayerAction.TurnLeft:
player.TurnLeft();
break;
case PlayerAction.TurnRight:
player.TurnRight();
break;
}
}
}
}
ソースコードの解説は割愛しますが、BoxScript の時と同様に Enum を用意して、
設定を変更できるようにしています。
さらに、GameScene3 の下部の床を選択して、FloorScript の Player Action を「TurnLeft」に設定してください。

これで GameScene3 がクリアできるようになります。

おわりに
今回の内容はちょっと短めですがここまでとなります。
プロトタイプ編についてはここまでで一区切りとして、次回からはアセット適用編へと進む予定です。
アセットを適用することで、ゲームらしさが一気に増してきますのでお楽しみに!
連載目次リンク
関連する連載リンク
© Unity Technologies Japan/UCL



