【unity插件相关】Outline Effect 简单的物体描边/高亮插件

  • 插件链接:https://assetstore.unity.com/packages/vfx/shaders/fullscreen-camera-effects/outline-effect-78608
  • 简易使用方式(自己的项目是2d的,插件自带3d示例):
    1. 给想要描边的sprite挂上outline脚本
      • 可以调本物体描边的颜色
      • erase 就不显示描边了,但边界实际存在,参与计算与其它outline的重叠情况
    2. 给相机挂上Outline Effect脚本
      • 可以调line color预设值,在脚本中增减预设值个数
      • 其它线条粗细等属性
      • 一个影响较大的是add lines between colors是有不同颜色outline的物体相连的时候,边缘是否划线
      • 开:【unity插件相关】Outline Effect 简单的物体描边/高亮插件_第1张图片***这里小女孩是挂了outline,颜色设置为全透明或者勾选Erase Renderer
      • 关:【unity插件相关】Outline Effect 简单的物体描边/高亮插件_第2张图片
    3. 用脚本控制
      • 项目中做了一个点选房间高亮显示:
            Transform curRoom; //当前正在选的
            Transform nextRoom; //玩家新点上的
            bool isChoosingRoom = false;
        
            public void ChoosingRoom(Transform room)
            {
        		nextRoom = room.GetChild(0).transform;
                if (isChoosingRoom == false) 
                {
                    //没有room被选中
                    DoOutline();
                }
                else if(room == curRoom)
                {
                    //点的就是现在正选着的
                    isChoosingRoom = false;
                    CancelOutline(false);         
                }else
                {
                    //点的不是正选着的
                    CancelOutline(true);
                }
            }
        
             void DoOutline()
            {
                print("应该显示" + nextRoom.name);
                for (int i = 0; i < nextRoom.childCount; i++)
                {
                    if (nextRoom.GetChild(i).GetComponent())
                    {
                        nextRoom.GetChild(i).GetComponent().color = 1;
                    }            
                }
                isChoosingRoom = true;
        		curRoom = nextRoom;
            }
        
            void CancelOutline(bool newRoom)
            {
                print("应该取消掉" + curRoom.name);
                for (int i = 0; i < curRoom.childCount; i++)
                {
                    if (curRoom.GetChild(i).GetComponent())
                    {
                        curRoom.GetChild(i).GetComponent().color = 0;
                    }
                }
                if (newRoom)
                {
                    DoOutline();
                }else
                {
                    curRoom = null;
                    isChoosingRoom = false;
                }        
            }

        这里是color=0 为透明,color=1 为黄色,因为房间有重叠的地方,需要把遮盖的部分也描边,所以全部outline都是enabled的。  PS.当时没发现有erase这个东西,应该也是可以实现的

      • 效果如下:点选书房,被二楼挡住的部分会切掉,并且根据层级关系勾勒出小人的边缘

      • 【unity插件相关】Outline Effect 简单的物体描边/高亮插件_第3张图片

  • 踩坑:影响边线的上下级关系的因素:

    • 因为所有的物件和人物的sprite都要有遮挡关系,需要设置同一个Sorting Layer,然后把order整理好,这个不管有没有边线都要做的,这个是影响sprite渲染的上下层关系

    • 然后线不跟着这个上下关系走,需要把sprite的位置z值设置成有前后关系(对,写这一篇完全是因为这个破坑!)

    • sprite的position.z相等的时候,就会出现奇怪的效果比如:

    • 【unity插件相关】Outline Effect 简单的物体描边/高亮插件_第4张图片

    • 要这样前后拉开就可以保证边缘线的遮挡关系了

    • 【unity插件相关】Outline Effect 简单的物体描边/高亮插件_第5张图片【unity插件相关】Outline Effect 简单的物体描边/高亮插件_第6张图片

    • 然后再举个栗子:

    • 【unity插件相关】Outline Effect 简单的物体描边/高亮插件_第7张图片

    • 这个的关系是:

      • Sorting Layer :柜子<人物<书桌

      • Z值:柜子≤书桌<人物

      • 如果z值也是 柜子<人物<书桌,则不会显示人物在物体背后的边缘线,像这样

      • 【unity插件相关】Outline Effect 简单的物体描边/高亮插件_第8张图片

  • 所以以后再弄迷糊了就来复习一下♪(^∇^*)

你可能感兴趣的:(GapYear)