厨二病でもブログがしたい

妄言に限りなく近い何か

「[Unity5]当たり判定の管理手法とか」

今回のタイトル、エンジニアっぽくてちょっとかっこよくない?

なんちゃってエンジニアの癖に技術記事とか生意気ですね。

はいはい、本題行くよー。
アクションゲームだと腐るほど当たり判定が必要になるよね! そこで!複数の当たり判定をまとめて管理しちゃおうっていう。

じゃじゃん!図にするとこんな感じ~

f:id:sanaftg:20151217142758j:plain

私で図解するんですか。
・・・MVCでもないのにControllerとかいう名前付けちゃうんですね。

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class TriggerObserver : MonoBehaviour {
    public string name;
    private TriggerController controller;
    private SphereCollider collider;
    void Start () {
        //ルートオブジェクトからTriggerControllerを取得
        GameObject parent = transform.root.gameObject;
        controller = parent.GetComponent();
        collider = GetComponent();
        
        //TriggerControllerに登録
        controller.AddTriggerCollider(name,collider);
        collider.enabled = false;
    }
    }
    void OnTriggerEnter(Collider target)
    {
        controller.Enter(name,target);
    }
}

細かいことは気にしない!
で、これが各ColliderにつけるObserver側かなー。
isTriggerしか使ってないから外したらどうなるかわかんない(笑)

今日も酷い投げっぷりですね、お嬢様。
ここまで紹介しておいてなんですけど、丸々コピーして使わないほうがいいみたいです。

ま、まぁこのObserverがControllerのメンバに登録されて、TriggerControllerを呼び出せば
そのオブジェクト内の当たり判定をまとめて扱えちゃうってこと!

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class TriggerController : MonoBehaviour {
    public Dictionary colliders = new Dictionary();

    /**
     * 当たり判定のONOFF
     */
    public void OnEnter(string name,bool active)
    {
        this.colliders[name].enabled = active;
    }
    
    
    /**
     * 当たり判定の追加
     */
    public void AddTriggerCollider(string name, SphereCollider collider)
    {
        this.colliders.Add(name,collider);
    }
    
    
    /**
     * 侵入検知処理
     */
    public void Enter(string name,Collider target)
    {
        GameObject targetObj = target.gameObject;
        switch(name){
            case "Sample1":
                //Smaple1を検知したときの処理
            break;
            case "Sample2"
                //Sample2を検知したときの処理
            break;
            default:
            break;
        }
    }
}

わかる方には突っ込みどころ満載で、わからない方にはつまらない最低の記事ですね。
一応聞きますけど、どうやって使うんです?

Observerが当たり判定検知するとTrigerController.Enter()に名前とぶつかった対象が流れてくるから、やりたい処理を中に書くって感じ!

このEnterの中に処理を纏めて書ける・・・ってだけですか?
普通に書いててソース肥大しちゃう人や扱う判定の量が多すぎるとあんまりよくなさそうですね。

え~だってUnity使ってると、一部の処理しかしないScriptが量産されるし!
そういうのを整理する方法としてはありじゃない?

そうなんですね。
(それって書いてる人の問題では・・・)

あ!
よく考えたらこれキャラクターの当たり判定専用だから「TriggerController」って名前変!

どう考えても、継承させて使うべきですよね。
ほんと、今更ですけど。