using UnityEngine; /// <summary> /// 描画の優先順位変更トリガー用のオブジェクトにアタッチするスクリプト /// トリガー用のオブジェクトと画像のゲームオブジェクトは別々で考える /// </summary> public class Tunnel : MonoBehaviour { [SerializeField] private Renderer tunnelSprite; //キャラや敵よりも描画の優先順位の高い画像。今回はトンネル用の画像だが、どのゲームオブジェクトのRendererでもいい。 public int TunnelSpriteOrderNum => tunnelSprite.sortingOrder; //トンネル用の画像のOrder in Layerの値のプロパティ }
using UnityEngine; /// <summary> /// プレイヤーや敵などのキャラにアタッチし、表示の優先順位を変更するスクリプト /// </summary> public class SpriteOrderSwitcher : MonoBehaviour { private SpriteRenderer sr; // アタッチしたキャラの SpriteRenderer private int defaultOrderNum; // SpriteRenderer の初期値。優先順位を元の状態に戻すにときに使う private void Reset() { if(transform.GetChild(0).TryGetComponent(out sr)) { Debug.Log($"SpriteRenderer 取得しました : {sr}"); } else { Debug.Log($"SpriteRenderer 取得できません : {sr}"); } // 初期値設定 defaultOrderNum = sr.sortingOrder; } private void Start() { Reset(); } private void OnTriggerStay2D(Collider2D other) { // 今回の場合、キャラ(プレイヤーや敵)がトンネルに侵入している間 if (other.TryGetComponent(out Tunnel tunnel)) { // このキャラの表示優先順位をトンネルよりも低い値に設定する // 固定値で値をセットせず変数で指定することで、トンネルにアサインされている画像に対応できる sr.sortingOrder = tunnel.TunnelSpriteOrderNum - 1; } } private void OnTriggerExit2D(Collider2D other) { // 今回の場合、キャラ(プレイヤーや敵)がトンネルから出たとき // out キーワード時の変数を _ にすると、Tunnnel クラスを取得はする(判定はする)が、取得した情報は if 文内で使わないことを明示的に示せる if (other.TryGetComponent(out Tunnel _)) { // このキャラの表示優先順位を元の値に戻す sr.sortingOrder = defaultOrderNum; } } }
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Tilemaps; //階段を登ったら、トンネル出入り用のコライダーのオン、オフを切り替える public class MapManager : MonoBehaviour { public bool isClimbedStairs = false; //階段を登ったか、登ってないか(建物の上にいるか、下にいるか) //切り替えるコライダー [SerializeField] private Collider2D leftTunnelWall; [SerializeField] private Collider2D rightTunnelWall; [SerializeField] private Collider2D gateTopWall; [SerializeField] private TilemapCollider2D wall_switchTilemap; /// <summary> /// 階段を登ったかどうか(建物の上にいるかどうか)を判定し、それに合わせて各地のコライダーのオンオフを切り替える /// (これを切り替えないと、意図しない場所でキャラが引っかかって通れない場所が発生したりする) /// </summary> /// <param name="isClimbedStairs">階段を登ったか、登ってないか(建物の上にいるか、下にいるか)</param> public void JudgeClimbedStairs() { //階段を登った(建物の上にいる)際の処理 if (isClimbedStairs) { leftTunnelWall.enabled = false; rightTunnelWall.enabled = false; gateTopWall.enabled = true; wall_switchTilemap.enabled = true; } //階段を降りた(建物の下にいる)際の処理 if (!isClimbedStairs) { leftTunnelWall.enabled = true; rightTunnelWall.enabled = true; gateTopWall.enabled = false; wall_switchTilemap.enabled = false; } Debug.Log("コライダーのオン、オフを切り替えました"); } }
using UnityEngine; /// <summary> /// プレイヤーの描画処理とマップのコライダー処理 /// </summary> public class SpriteOrderSwitcher : MonoBehaviour { private SpriteRenderer sr; //アタッチしたキャラのSpriteRenderer private int defaultOrderNum; //SpriteRendererの初期値。優先順位をもとの状態に戻すときに使う private float xCoordinate; //OnTriggerEnter時にx座標を記録しておく private float yCoordinate; [SerializeField] private MapManager mapManager; [SerializeField] private int TunnnelSpriteOrderNum; //トンネルの描画値 void Start() { Reset(); } private void Reset() { if (transform.GetChild(0).TryGetComponent(out sr)) { defaultOrderNum = sr.sortingOrder; //Debug.Log($"SpriteRendererを取得しました:{sr}"); } } /// <summary> /// コライダーに入った時、xまたはy座標を記録する /// </summary> /// <param name="other"></param> private void OnTriggerEnter2D(Collider2D other) { if (other.gameObject.name == "LayerTrigger0") //<= 今回の場合には階段は2つあり、それぞれ向きが違うのでゲームオブジェクトの名前で分岐 { yCoordinate = transform.position.y; Debug.Log($"yCoordinate:{yCoordinate}"); } if (other.gameObject.name == "LayerTrigger1") { xCoordinate = transform.position.x; } } /// <summary> /// コライダーに出入りする際の座標の差に応じてコライダーと描画を切り替える /// </summary> /// <param name="col"></param> private void OnTriggerExit2D(Collider2D col) { if (col.gameObject.name == "LayerTrigger0") { //コライダーから出た時と入った時の座標が一定以上離れていたら if (Mathf.Abs(yCoordinate - transform.position.y) > 2f) { //真偽値を反転させる mapManager.isClimbedStairs = !mapManager.isClimbedStairs; mapManager.JudgeClimbedStairs(); //キャラの描画順をトンネルよりも高くする SwitchSpriteOrder(mapManager.isClimbedStairs); } } if (col.gameObject.name == "LayerTrigger1") { if (Mathf.Abs(xCoordinate - transform.position.x) > 2f) { mapManager.isClimbedStairs = !mapManager.isClimbedStairs; mapManager.JudgeClimbedStairs(); SwitchSpriteOrder(mapManager.isClimbedStairs); } } //次回の判定に備えて、各変数を初期化 xCoordinate = 0; yCoordinate = 0; } /// <summary> /// 各キャラの描画順の切り替え /// </summary> /// <param name="bringToFront">キャラの描画をbase_switchよりも前面に持ってくるかどうか</param> private void SwitchSpriteOrder(bool bringToFront) { if (bringToFront) { sr.sortingOrder = TunnnelSpriteOrderNum + 2; } else { sr.sortingOrder = defaultOrderNum; } //Debug.Log("SwitchSpriteOrderが動きました"); } }