Unity与C#学习记录 - 09

14 篇文章 0 订阅

01 MIT协议

发现GitHub有关Unity项目附带了一段MIT协议,以前也没仔细看过,这里特地学习记录下:

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

一开始就是说免费授权给所有人,包括文档,授权没有限制,不限制使用、复制、修改、合并、出版发行、散布、再授权及贩售软件及副本等。MIT许可是相对宽松的,相比于三条款BSD许可,MIT许可能赋予软件被授权人更大的权利和更少的限制。

“and to permit persons to whom the Software is furnished to do so”,这个and就是就是和前面的并列,也就是granted to any person,to deal in,and to permit。所以就算“及授予被供应人同等权利”,仅需服从以下义务:

在软件和软件的所有副本中都必须包含以上版权声明和本许可声明。

下面的更难一些,“AS IS”翻译为按原样,也就是“如是”,本软件按“如是”状况提供,本软件以“现状”提供,没有任何形式的明示或暗示保证,包括但不限于为特定目的和不侵权的适销性和适用性的保证。这句话形容词很多,比较绕,毕竟法律条文晦涩难懂。

还有一句,也就是,在任何情况下,作者或者版权持有人都无权要求任何索赔,损害担责或的其他责任(liability),无论是在签合同、侵权(tort)及软件导致问题的时候。

02 Unity对象池

unity对象池主要用于提升性能,因为频繁创建销毁对象会增加很多消耗,如大量的子弹,所以用对象池管理起来,没有就创建,不要的时候则将其设置为非激活状态即可。

我找到的最适合的代码就是这个:

https://github.com/Rfrixy/Generic-Unity-Object-Pooler

运行之后的场景是这样的:

可以根据需要扩展对象池大小,如果够则从池子中捞出,设置为激活,如果不够就继续创建:

代码都可以在该项目中看到,非常简洁,下面是一个获取池中对象的方法:

public GameObject GetPooledObject(int index)
{
    int curSize = pooledObjectsList[index].Count;

    for (int i = positions[index] + 1; i < positions[index] + pooledObjectsList[index].Count; i++)
    {
        if (!pooledObjectsList[index][i % curSize].activeInHierarchy)
        {
            positions[index] = i % curSize;
            return pooledObjectsList[index][i % curSize];
        }
    }

    if (itemsToPool[index].shouldExpand)
    {
        GameObject obj = Instantiate(itemsToPool[index].objectToPool);
        obj.SetActive(false);
        obj.transform.parent = transform;
        pooledObjectsList[index].Add(obj);

        return obj;
    }

    return null;
}

其他的代码就不贴了,总共没多少行其实,适合学习。

需要注意的是,设置为非激活状态的对象也会占用内存。比如我一个空场景,运行在安卓手机上,使用如下命令看下使用内存情况:

adb shell dumpsys meminfo com.huawei.generictest

差不多占用一百M内存,如果我创建五六个高质量音频节点,且这些都是非激活状态,运行后内存占用达到了700M。如果是激活状态,运行的时候自动同时播放这五六个音轨,发现其内存占用和之前的基本不变。

所以像子弹这种适合用对象池处理,音频毕竟播放时间较长才会换一个,所以不是很适合用对象池。

03 C#枚举扩展

我曾经为了让事件类型可扩展,将枚举类型改成了类,类里放常量字符串。但是还是枚举更标准一些,后来得知枚举可以这样扩展:

using UnityEngine;

public class TestEnum : MonoBehaviour
{
    public enum Test
    {
        Type1 = 1,
        Type2 = 2,
        UserDefined = 10
    }

    void Start ()
    {
        Test extendedEnumType = Test.UserDefined + 1;

        TestCase(Test.Type1);
        TestCase(extendedEnumType);
    }

    void TestCase(Test option)
    {
        Debug.Log(option);
        
        switch(option)
        {
            case Test.Type1:
                Debug.Log("type 1");
                break;

            case Test.Type2:
                Debug.Log("type 2");
                break;

            case Test.UserDefined + 1:
                Debug.Log("type 11");
                break;

            default:
                break;
        }
    }
}

得到输出为:

Type1
type 1
11
type 11

这样就达到了类似类的继承的效果,且还能继续使用枚举。只需要维护一些变量,赋予有意义的名字,让它在UserDefined的基础上加一些整数即可。

04 Unity Shader Graph

前面写过一点Unity Shader的入门学习笔记,也简单了解了以下渲染管线有关知识。现在看Unity Shader,很多教程都在介绍Unity Shader Graph了,我学习了几个教程发现确实很不错,在此留下笔记。

Unity Shader Forge我没有用过,不过看过一些介绍,发现现在的Unity Shader Graph和它很像,再后来发现Unreal的也是类似,都是用节点化的方式来制作Shader。这种方式让我想起了曾经使用的PlayMaker,能简化许多代码上的工作,尤其是在Shader这种需要许多数学物理知识的情况下,想直接就敲代码来实现也是不容易的。下面放一个Unreal的Shader节点图:

FN_Completed_Materail.png

这个有点尴尬了,本来是记录Unity的,却先放了对手的图。

因为涉及许多节点添加和效果实时查看,所以还是直接看视频更好学习。这里推荐Brackeys,他在Youtube上放了许多Unity教程可以学习,不止Shader Graph。比如这个:

https://www.youtube.com/watch?v=taMp1g1pBeE

在正式开始之前,先看Unity版本是不是2018,因为要2018版才能用Shader Graph。在Window->Package Manager中找到Render-Pipelines,选择一个轻量级的也就是lightweight,安装该包之后就会有Shader Graph了。另外要说下,用了2018.3版本发现找不到这个包了,那么你需要在下图所示位置点击Advanced选择显示预览包:

再一点,当你在Assets中Create->Rendering->Lightweight Render Pipeline Asset后,需要在Edit->Project Settings中找到Graphics,然后选择该渲染管线:

接着你需要Create->Shader->PBR Graph,然后双击编辑,2018.3版本中发现Shader Graph的属性窗口没了,这时候你需要重置窗口布局就能找到它了,也就是:

例子一般视频讲解都是十多分钟,我这里就不完整记录一步步怎么做的了,看一个片段:

Voronoi图也就是泰森多边形,这里用它来模拟水面的。为了让它动起来,就需要添加一个Time节点。添加节点可以右键或者用空格快捷键。时间和RipplesSpeed相乘后作为输入来控制Angle Offset。这里Multiply也是一个节点,对应的,加减乘除都是有的,可以根据需要选。最终得到的水面效果如下:

该例子来自于:

https://www.youtube.com/watch?v=jBmBb-je4Lg

另外,菲涅尔材质用途也较广,Brackeys的这个教程就是关于菲涅尔的:

https://www.youtube.com/watch?v=Ar9eIn4z6XE&t=602s

效果如下:

菲涅尔材质介绍,Unreal的文档有很多内容:

http://api.unrealengine.com/CHN/Engine/Rendering/Materials/HowTo/Fresnel/

使用菲涅尔材质可以凸显人物轮廓,或显示能量护盾之类的效果,还可以做烟雾和火焰等。

实际使用上可以感受到用Shader Graph能非常方便地创建各种特效Shader,对于不太熟悉Shader编程的人,比如我,还是非常有吸引力的。制作过程中调节参数能实时看到效果,学习几个教程之后就会有基本了解了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值