創作內容

11 GP

Unity的 RTS戰爭迷霧 建築特效

作者:樂小呈│2019-09-16 16:14:39│巴幣:22│人氣:368
總之就是建築物不會消失在霧中,取而代之的是靜態的圖
畢竟建築物不會亂跑...吧,動產?


其實會跑也沒差...這個做法是讓原本的物件在霧中隱藏
然後生成一個分身,而分身就和原本的物件相反 - 要在玩家的視線中隱藏,只顯示在霧中

我還不太會寫這種文,所以如果有那裡看不懂、不清楚的,請一定要提出!
拜託別看這幾篇教學,誤人子弟
我只是不忍心刪掉而已QAQ

上成品~
那個奇怪的建築物在視線中有動畫,視線離開後就只剩靜態的圖(動畫要自己做)


作法上面講過了,直接開始~~
這次要新增一個腳本,然後還要改一個舊腳本

HideWithFogs - 新增一個變數
只需要一個Sprite就好,放要顯示在霧中的圖(不放就跟原本一樣)
    [SerializeField] Transform[] checkPoints;                                                  
    [SerializeField] float pointRadius;                                                              

    [SerializeField] Sprite showInFogSprite;                                             //用來放Sprite

    [SerializeField] LayerMask fogLayer;                                                        
    [SerializeField] int hideLayer;                                                                    
    int defaltLayer;                                                                                           

SpriteInFog  -  變數,跟HideWithFogs差不多,不多解釋
    Transform[] checkPoints = new Transform[0];    
    float pointRadius = 0.1f;                                                          

    LayerMask fogLayer;                                                                                       

HideWithFogs - 檢查物件是否在霧中
把設置Layer改成只有Layer更改時才會更改(繞口?
加入判斷要不要生成靜態圖
    void CheckObjInFog()
    
{
        if (checkPoints.Length == 0) { return; }

        bool hideWithFog = true;

        foreach (var point in checkPoints)
        {
            if (!Physics2D.OverlapCircle(point.position, pointRadius,fogLayer))
            {
                hideWithFog = false;
                break;
            }
        }

        int currentLayer = (hideWithFog) ? hideLayer : defaultLayer;

      
  if (currentLayer != gameObject.layer)                                        //檢查Layer是否有更動
        {
            SetLayerRecursively(gameObject, currentLayer);                 //設置Layer

            if (currentLayer == hideLayer)                                                //判斷
生成靜態圖
            {
                GenerateHideSprite();                                                        //生成靜態圖
            }
        }

    }

HideWithFogs  -  生成靜態圖
判斷要不要生成靜態圖
生出一個GameObjcet在自己的位置,然後附上SpriteInFog(也可以用Prefab就好)
調用SpriteInFog的SetSpriteInFog來設置靜態圖
    void GenerateHideSprite()
    
{
        if(showInFogSprite == null) { return; }                                                       //
判斷要不要生成靜態圖

        GameObject spriteInFog = new GameObject();                                       //生成
GameObjcet
        spriteInFog.transform.position = transform.position;                                //設置位置

        SpriteInFog hideSprite = spriteInFog.AddComponent<SpriteInFog>();   //
附上SpriteInFog腳本

        hideSprite.SetSpriteInFog(checkPoints, pointRadius, showInFogSprite, fogLayer);
                                                                                                                          //
設置靜態圖

    }

SpriteInFog   - 設置靜態圖
先設置一些基本的變數checkPointspointRadiuslayer、SpriteRenderer
最後再生成檢查點
    public void SetSpriteInFog(Transform[] points,float radius,Sprite showSprite,LayerMask layer)
    
{
        checkPoints = new Transform[points.Length];                                      //設置
checkPoints

        pointRadius = radius;                                                                            //設置radiius

        SpriteRenderer renderer = gameObject.AddComponent<SpriteRenderer>();
        renderer.sprite = showSprite;
                                                    //設置顯示在霧中的圖
        renderer.renderingLayerMask = 1;                                                        //RenderingLayer要比背景的高
                                                                                                                
        fogLayer = layer;                                                                                    //設置Layer

        for (int i = 0; i < points.Length; i++)                                                         //生成
checkPoints
        {
            GameObject point = new GameObject();                                           //生成GameObject
            point.transform.parent = transform;                                                    //設置父物件
            point.transform.position = points[i].position;                                       //設置位置

            checkPoints[i] = point.transform;                                                        //加入陣列
        }
    }

SpriteInFog   - 檢查物件是否在霧中
判斷與HideWithFogs相反,這個物件是不在霧中就要消失
直接看吧,不多解釋,拿HideWithFogs的來改就好了
    void CheckObjInFog()
    
{
        if (checkPoints.Length == 0) { return; }

        foreach (var point in checkPoints)
        {
            if (!Physics2D.OverlapCircle(point.position, pointRadius, fogLayer))
            {
                Destroy(gameObject);
                break;
            }
        }

    }


完成~


我可不可以之後就把檔案丟出來,讓需要的人自己研究R
寫這個好累喔┐(´д`)┌


引用網址:https://home.gamer.com.tw/TrackBack.php?sn=4530981
All rights reserved. 版權所有,保留一切權利

相關創作

同標籤作品搜尋:Unity

留言共 2 篇留言

保全之智乃(小熊模式)
寫註解讓以後的自己也看得懂> <

09-16 17:17

樂小呈
其實我平常不會像上面那樣註解,那些(前幾篇也是)註解些都是在寫文的時候加的XD09-16 17:30
樂小呈
真的要寫的話,我大多只會寫分類用的註解09-16 17:30
olinvena
剛開始接觸unity,想做個用來打開桌遊地圖圖片,有戰爭迷霧效果的圖片檢視器,目前還在各種摸索中,大大能分享檔案讓我研究嗎?OAQ 這樣對應文章內容更容易了解

04-08 15:44

樂小呈
我檔案是還留著啦...但最好不要看這幾篇教學,誤人子弟[e8]04-08 15:51
樂小呈
這是一年多前寫的,那時候我程度也沒多好,現在再看這內容有夠痛苦的,我只是不忍心刪掉而已[e3]04-08 15:51
樂小呈
如果你真的堅持是可以提供檔案沒關西,只要你確定想看[e8]04-08 15:51
我要留言提醒:您尚未登入,請先登入再留言

11喜歡★angus945 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:【建模】 LowPoly... 後一篇:Unity 物品輸送帶...

追蹤私訊切換新版閱覽

作品資料夾

SALOL~~
望德勒斯圖書館更新中~看更多我要大聲說昨天15:03


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】