Unity_一個關于自蔓延性的神經(jīng)元功能

效果圖.png

如圖:隨意點擊一個按鍵牍氛,開啟檢測六水,當連線觸發(fā)到另外一個按鍵的時候,會檢測他需要連接的其他物體凰盔。這種功能類似我們的大腦神經(jīng)元墓卦。廢話不多說,直接上代碼(需要用到Vectrosity插件户敬,下載地址:鏈接:http://pan.baidu.com/s/1hs7u7cg 密碼:zq1w):
1.新建一個腳本落剪,這個腳本用來計時,并且整個系統(tǒng)的初始化方法也在這

using System.Collections;
using UnityEngine;
///游戲控制器尿庐,掛載在攝像機上
public class GameMgr : MonoBehaviour
{
    private static GameMgr instance;

    public static GameMgr Instance
    {
        get
        {
            return instance;
        }
    }

    /// <summary>
    /// 計時器
    /// </summary>
    private float timer = 0.1f;
    /// <summary>
    /// 時長
    /// </summary>
    private float duration = 0.1f;

    private void Awake()
    {
        instance = this;
    }

    private void Update()
    {
        timer += Time.deltaTime;
        if (timer >= duration)
        {
            GlobalData.running = true;
            timer = 0;
        }
        else
        {
            GlobalData.running = false;
        }
    }
    /// <summary>
    /// 神經(jīng)元路徑初始化
    /// </summary>
    public IEnumerator NeurePathReset()
    {
        Debug.Log("重置神經(jīng)元路徑");
        yield return new WaitForSeconds(3f);
        GlobalData.connectStart = false;
        GlobalData.connectOver = false;
        for (int i = 0; i < GlobalData.connectPath.Count; i++)
        {
            GameObject obj = GlobalData.connectPath[i].gameObject;
            GlobalData.connectPath[i].ResetNeure();
            ObjectPools.Instance.IntoPool(obj, "Path");
        }
    }

}

2.在寫一個對象池忠怖,掛載在攝像機上(畫線的物體使用對象池,減少消耗)

using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 對象池(用路徑來創(chuàng)建池)
/// </summary>
public class ObjectPools : MonoBehaviour
{
    private static ObjectPools instance;

    /// <summary>
    /// 對象池管理字典{池名 : 池內(nèi)對象 }
    /// </summary>
    Dictionary<string, List<GameObject>> PoolController = new Dictionary<string, List<GameObject>>() { };

    public static ObjectPools Instance
    {
        get
        {
            return instance;
        }

        set
        {
            instance = value;
        }
    }

    void Awake()
    {
        instance = this;
    }

    /// <summary>
    /// 對象池名字
    /// </summary>
    /// <param name="poolName">對象池的名字為該物體Resources下路徑</param>
    /// <returns></returns>
    public GameObject GetPool(string poolName)
    {
        GameObject obj;
        if (PoolController.ContainsKey(poolName) && PoolController[poolName].Count > 0)
        {            
            obj = PoolController[poolName][0];
            PoolController[poolName].RemoveAt(0);//把第一個位置釋放抄瑟;
        }
        else if (PoolController.ContainsKey(poolName) && PoolController[poolName].Count <= 0)
        {

            obj = Instantiate(Resources.Load<GameObject>(poolName));
        }
        else 
        {
            obj = Instantiate(Resources.Load<GameObject>(poolName));
            PoolController.Add(poolName, new List<GameObject>() { });
        }
        obj.SetActive(true);
        return obj;
    }

    /// <summary>
    /// 放入池子中的方法
    /// </summary>
    /// <param name="go"></param>
    public void IntoPool(GameObject obj,string key)
    {
        obj.transform.parent = null;
        obj.SetActive(false);
        PoolController[key].Add(obj);
    }

}
  1. 新建一個腳本凡泣,存儲數(shù)據(jù)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public static class GlobalData
{
    /// <summary>
    /// 開啟連接檢測?
    /// </summary>
    public static bool connectStart = false;
    /// <summary>
    /// 連接線是否開始  --  經(jīng)緯度畫線控制
    /// </summary>
    public static bool running;
    /// <summary>
    /// 所有相關聯(lián)的連接是否完成
    /// </summary>
    public static bool connectOver;
    /// <summary>
    /// 連接路徑
    /// </summary>
    public static List<Path> connectPath = new List<Path>();
}

4.新建一個類皮假,用來管理Tag值

public class Tags
{
    /// <summary>
    /// 神經(jīng)元標簽
    /// </summary>
    public const string Neure = "Neure";
    /// <summary>
    /// 路徑標簽
    /// </summary>
    public const string Path = "Path";
}

5.接下來是重點:新建一個腳本鞋拟,神經(jīng)元腳本,這個腳本掛載在每一個需要檢測的物體身上(改物體的Tag值為:Neure)

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

public class Neure : MonoBehaviour
{
    private Button OnClick;
    /// <summary>
    /// 是否被觸發(fā)
    /// </summary>
    [HideInInspector]
    public bool isTrigger = false;
    /// <summary>
    /// 檢測其他神經(jīng)元
    /// </summary>
    List<Neure> checkNeure = new List<Neure>();

    private void Awake()
    {
        OnClick = transform.GetComponent<Button>();
        OnClick.onClick.AddListener(
            ()=>
            {
                GlobalData.connectStart = true;
                CheckOtherNeure();
            });
    }

    /// <summary>
    /// 檢測其他神經(jīng)元網(wǎng)絡
    /// </summary>
    public void CheckOtherNeure()
    {
        if (GameObject.FindGameObjectsWithTag(Tags.Neure).Length <= 1)
        {
            return;
        }
        checkNeure.Clear();
        this.isTrigger = true;
        for (int i = 0; i < GameObject.FindGameObjectsWithTag(Tags.Neure).Length; i++)
        {
            Neure neure = GameObject.FindGameObjectsWithTag(Tags.Neure)[i].GetComponent<Neure>();
            if (neure.isTrigger == false)
            {
                checkNeure.Add(neure);
            }
        }
        if (checkNeure.Count != 0)
        {
            StartConnectOtherNeure();
        }
    }

    /// <summary>
    /// 開始連接其他神經(jīng)元
    /// </summary>
    private void StartConnectOtherNeure()
    {
        for (int i = 0; i < checkNeure.Count; i++)
        {
            GameObject obj = ObjectPools.Instance.GetPool("Path");
            obj.transform.SetParent(transform);
            obj.transform.localPosition = Vector3.zero;
            obj.transform.localScale = new Vector3(1, 1, 1);
            obj.GetComponent<Path>().sponsorNeure = this;
            obj.GetComponent<Path>().ConnectOtherNeure(checkNeure[i]);
        }       
    }
}

6.新建一個空物體惹资,放到Resources文件夾下(Tag值為Path)


LGFGR99M@8F8SM@VP7@QYI0.png
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Vectrosity;

public class Path : MonoBehaviour
{
    /// <summary>
    /// 兩點之間的距離
    /// </summary>
    private int DistanceBetweenPoints = 1;
    /// <summary>
    ///  發(fā)起者神經(jīng)元
    /// </summary>
    [HideInInspector]
    public Neure sponsorNeure;
    /// <summary>
    /// 目標點
    /// </summary>
    [HideInInspector]
    public Neure targetNeure;
    /// <summary>
    /// 路徑
    /// </summary>
    private VectorLine pathLine;
    /// <summary>
    /// 畫線材質
    /// </summary>
    public Material lineMaterial;
    /// <summary>
    /// 方向向量
    /// </summary>
    private Vector3 direction;
    /// <summary>
    /// 偏移向量
    /// </summary>
    private Vector3 offsetDirection;
    /// <summary>
    /// 路徑被分割的點
    /// </summary>
    private int pathCount = 0;
    /// <summary>
    /// 下標
    /// </summary>
    private int index = 0;

    private bool isCallBack = false;
    private void Update()
    {
        if (GlobalData.connectStart == false)
        {
            return;
        }
        if (index >= pathCount)  // 該條神經(jīng)元連接完畢
        {
            if (isCallBack == false)
            {
                isCallBack = true;
                GlobalData.connectPath.Add(this);
                ConnectSuccseCallBack();
                targetNeure.CheckOtherNeure();
            }
            return;
        }
        if (GlobalData.running && pathCount != 0)
        {
            index++;
            transform.position = index * direction / pathCount - offsetDirection;
            pathLine.points3.Add(transform.position);
            pathLine.Draw();
        }
    }

    /// <summary>
    /// 鏈接其他神經(jīng)元
    /// </summary>
    public void ConnectOtherNeure(Neure neure)
    {
        targetNeure = neure;
        direction = targetNeure.transform.position - transform.position;
        offsetDirection = Vector3.zero - transform.position;
        pathCount = (int)(Vector3.Distance(transform.position, neure.transform.position) / DistanceBetweenPoints);
        index = 0;
        pathLine = new VectorLine("Path", new List<Vector3>(), lineMaterial, 12.0f, LineType.Continuous);
        pathLine.textureScale = 1.0f;
        pathLine.points3.Add(transform.position);
    }

    /// <summary>
    /// 連接成功回調(diào)
    /// </summary>
    private void ConnectSuccseCallBack()
    {
        for (int i = 0; i < GameObject.FindGameObjectsWithTag(Tags.Path).Length; i++)
        {
            if (GameObject.FindGameObjectsWithTag(Tags.Path)[i].GetComponent<Path>().isCallBack == false)
            {
                Debug.Log("還未鏈接完畢");
                break;
            }
            if (i == GameObject.FindGameObjectsWithTag(Tags.Path).Length - 1)
            {
                GlobalData.connectOver = true;
                StartCoroutine(GameMgr.Instance.NeurePathReset());
                Debug.Log("鏈接完畢");
            }
        }
    }

    /// <summary>
    /// 清空該條神經(jīng)元上的所有數(shù)據(jù)
    /// </summary>
    public void ResetNeure()
    {
        isCallBack = false;
        index = 0;
        pathCount = 0;
        sponsorNeure.isTrigger = false;
        targetNeure.isTrigger = false;
        pathLine.points3.Clear();
        pathLine.Draw();
    }
}

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末贺纲,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子褪测,更是在濱河造成了極大的恐慌猴誊,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件侮措,死亡現(xiàn)場離奇詭異懈叹,居然都是意外死亡,警方通過查閱死者的電腦和手機萝毛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門项阴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來滑黔,“玉大人笆包,你說我怎么就攤上這事÷缘矗” “怎么了庵佣?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長汛兜。 經(jīng)常有香客問我巴粪,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任肛根,我火速辦了婚禮辫塌,結果婚禮上,老公的妹妹穿的比我還像新娘派哲。我一直安慰自己臼氨,他們只是感情好,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布芭届。 她就那樣靜靜地躺著储矩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪褂乍。 梳的紋絲不亂的頭發(fā)上持隧,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機與錄音逃片,去河邊找鬼屡拨。 笑死,一個胖子當著我的面吹牛褥实,可吹牛的內(nèi)容都是我干的洁仗。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼性锭,長吁一口氣:“原來是場噩夢啊……” “哼赠潦!你這毒婦竟也來了?” 一聲冷哼從身側響起草冈,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤她奥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后怎棱,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哩俭,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年拳恋,在試婚紗的時候發(fā)現(xiàn)自己被綠了凡资。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡谬运,死狀恐怖隙赁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情梆暖,我是刑警寧澤伞访,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站轰驳,受9級特大地震影響厚掷,放射性物質發(fā)生泄漏弟灼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一冒黑、第九天 我趴在偏房一處隱蔽的房頂上張望田绑。 院中可真熱鬧,春花似錦抡爹、人聲如沸辛馆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昙篙。三九已至,卻和暖如春诱咏,著一層夾襖步出監(jiān)牢的瞬間苔可,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工袋狞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留焚辅,地道東北人。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓苟鸯,卻偏偏與公主長得像同蜻,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子早处,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 在我們的游戲開發(fā)過程中湾蔓,有一個很重要的工作就是進行碰撞檢測。例如在射擊游戲中子彈是否擊中敵人砌梆,在RPG游戲中是否撿...
    壹米玖坤閱讀 24,425評論 0 17
  • 1. 準備場景 下載并導入官方Space Shooter教程的范例素材包默责,我們僅使用其中的模型、材質咸包、貼圖桃序、Pre...
    shimmery閱讀 6,418評論 0 16
  • Ubuntu的發(fā)音 Ubuntu坟比,源于非洲祖魯人和科薩人的語言芦鳍,發(fā)作 oo-boon-too 的音。了解發(fā)音是有意...
    螢火蟲de夢閱讀 99,366評論 9 467
  • 文/七個小老頭 回望過去温算,總能發(fā)現(xiàn)當時的人怜校,當時說的話间影,有些可愛注竿。然后就會問自己,怎么我當初就沒有發(fā)現(xiàn)呢。...
    七個小老頭閱讀 163評論 0 0
  • 致親愛的你們: 我不是最聰明的人,也不是最笨的人宣谈。 在這歲月流失的時光里愈犹,伴隨的童年舍去,得到了成長闻丑。從畢業(yè)...
    謝家有男永登閱讀 481評論 6 5