はじめに
スマブラとかにある下からすり抜けられる床が欲しくなりました。
実装
プレーヤーと床のどちらにもscript書きます
プレーヤー側オブジェクト
(事前にキャラ作って当たり判定追加してるしてるって前提)
プレーヤーのInspectorのTagをPlayerに変更
プレーヤーにColliderを追加し、接触判定を上3/4に覆いかぶせるように設定します。
追加したColliderのIs TriggerをOnにします。
床側オブジェクト
床を作成してColliderを追加し、接触判定の下3/4に覆いかぶせるように設定します。
追加したColliderのIs TriggerをOnにします。
床側スクリプト作成
以下を床のオブジェクトに引っ付けましょう
public class PassFloor : MonoBehaviour {
bool setPass;
BoxCollider2D colliderOfPass;
// Use this for initialization
void Start () {
colliderOfPass = GetComponent<BoxCollider2D>();
}
// Update is called once per frame
void Update () {
if (setPass)
{
colliderOfPass.enabled = false;
}
if (!setPass)
{
colliderOfPass.enabled = true;
}
}
//プレイヤーのIsTriggerがOnの側のコリジョンが床のIsTriggerがOnの側のコリジョンと接触している時
void OnTriggerStay2D(Collider2D col)
{
if (col.gameObject.tag == "Player")
{
setPass = true;
}
}
void OnTriggerExit2D(Collider2D col)
{
if (col.gameObject.tag == "Player")
{
setPass = false;
}
}
}
実際の動き
IsTrrigerがOnになっている部分は物理的接触は発生しませんが、
IsTriggerをOnにしているColliderが接触するとOnTrigger...が読み込まれます。
事前に設定したbool変数をOnにして、その間は床のColliderの接触判定を切るって感じです
コンポーネントの読み込み仕様上、colliderOfPass = GetComponent();で読み込むコンポーネントはBoxCollider2Dが複数ある場合Inspectorの上側から読み込まれるのでIsTrigerがOnになっているコンポーネントは下に配置しましょうね。
これ二人プレイとかを考慮すると駄目な実装ですね・・・
二人プレイを考えたらどういう実装が良いんでしょうね