Staticイベントを使ってドアを開けるサンプルプログラムを書いてみましょう。実際にゲームで使われている様子を見ると参考にしやすいかも。Staticイベントがどんなものかについては下記リンクから確認してみてください
UnityでStaticイベントシステムを使おう【基礎編】
イベントを使うことでプログラム同士の処理をそれぞれ分けて作成することができます。反面、プログラムとして気をつける部分も出てきますのでサンプルを見ながら注意点…
目次
ボタンを押したら扉が開く
ピンクの部分をドアが開くボタンとして、触れたら赤い扉が下がって通れるようになるものを作りたいとします。
スクリプト
今回のスクリプトは主に3つ、おまけでキャラクター用のスクリプトを1つ。
using UnityEngine;
using System;
public class EventManager : MonoBehaviour
{
public static event Action OnDoorOpen;
public static void DoorOpen()
{
OnDoorOpen?.Invoke();
}
}
using UnityEngine;
public class Door : MonoBehaviour
{
private Vector3 m_targetPosition;
private bool m_bOpen = false;
private void DoorOpen()
{
m_bOpen = true;
}
private void Start()
{
m_targetPosition = transform.position + Vector3.down * 5f;
}
private void Update()
{
if( m_bOpen)
{
transform.position = Vector3.MoveTowards(
transform.position,
m_targetPosition,
10f * Time.deltaTime);
}
}
private void OnEnable()
{
DoorEventManager.OnDoorOpen += DoorOpen;
}
private void OnDisable()
{
DoorEventManager.OnDoorOpen -= DoorOpen;
}
}
using UnityEngine;
public class DoorTrigger : MonoBehaviour
{
private void OnTriggerEnter2D(Collider2D _collision)
{
DoorEventManager.DoorOpen();
}
}
using UnityEngine;
public class PlayerController : MonoBehaviour
{
void Update()
{
float fInputHorizontal = Input.GetAxisRaw("Horizontal");
transform.Translate(fInputHorizontal * 3f * Time.deltaTime, 0f, 0f);
if( 0 < fInputHorizontal)
{
transform.localScale = Vector3.one;
}
else if(fInputHorizontal < 0)
{
transform.localScale = new Vector3(-1f, 1f, 1f);
}
else { }
}
}
Unity側のセットアップ
今回のサンプルを動かすには4つのオブジェクトに設定が必要になります。黒い床はおまけです。あると雰囲気が出ます
オブジェクト | コンポーネントなど |
---|---|
EventManager | 空のゲームオブジェクトを作成 +EventManager |
ドア | スプライトQuad +Door |
ドアトリガー(ボタン) | キャラの少し前に小さくスプライト +DoorTrigger +BoxCollider2D BoxCollider2Dはトリガーモードに変更 IsTriggerにチェックを入れて下さい |
キャラクター | 別に白い画像のままでも大丈夫 キャラはお好みで +PlayerController +Rigidbody2D +BoxCollider2D Rigidbody2D >BodyType:Kinematic |
動かして確認
キャラクターは左右キーもしくはADキーで移動させることができます。ドアトリガーに触れるとドアが下に下がるのが確認できると思います。
もしうまく行かない場合は以下の点を見直してみて下さい
- ドアトリガーのIsTriggerにチェックが入っていない
- キャラクターにRigidbody2Dがついていない
- キャラクターにBoxCollider2Dがついていない
- Collider系が2Dじゃないものが混ざっている
- EventMangerのコンポーネントがシーン内に存在してない
コメント