美术脚本注意事项

美术脚本注意事项

代码脚本是被编译成dll,采用运行时挂载,非直接在工程环境中拖拽脚本到游戏对象上。
故美术提供的脚本需要做到可以动态挂载到预制上

1:所有引用都要通过代码动态设置
2:需要设置参数的要提供对应接口,或者设置为public变量
3:对于较为复杂的脚本,请提供接入文档

1、命名空间

使用统一的命名空间:ArtPerformance.ArtistScripts

2、Shader加载

2.1 通过设置public变量,外部动态进行赋值

可以设置为public的Shader变量,由lua端动态赋值

Example

public Shader ParameterName;

2.2 使用ResourceUtil方法

  • Shader.Find使用下图中的ShaderFind函数替代(不要使用该方法,请使用2.1的方式
  • ComputeShader使用ResourceUtil的Load函数加载(请使用2.1的方式

ps: 该方法需要将相关的资源放置到GeneralResource目录下,会增加ab包的体积。尽量少使用这个方法。除非这个资源会有许多器材使用到,这个时候推荐使用该方法。

【ResourceUtil代码下载】

Example

ResourceUtil.Load<ComputeShader>("HeatCompute");
ResourceUtil.ShaderFind("Hidden/RenderTech/RenderPosition");

3、贴图与材质

3.1 通过设置public变量,外部动态进行赋值

材质与贴图可直接设置变量,lua端对接时可以对其进行赋值。

Example

public Texture2D ParameterName;

3.2 动态生成

canvasTexture = RenderTexture.GetTemporary(512, 512, 0, RenderTextureFormat.ARGBHalf);
GetComponent<Renderer>().material.SetTexture("_WetTexuture", canvasTexture);

3.3 使用ResourceUtil方法

尽量少用,理由同上

4、射线检测

  • 使用Physics.Raycast只返回第一个命中的Collider,可能存在目标物体,被其它的Collider挡住的情况,可以使用RaycastAll
  • 实验室的一般元器件的层级是LabObject,可以在射线检测时,指定对应的层级

Layer使用情况

Example

var hits = Physics.RaycastAll(transform.TransformPoint(rayOffset), transform.TransformDirection(drawRayDir), fwdRayLength, LayerMask);

5、内存泄漏

5.1 RenderTexture

RenderTexture.GetTemporary分配的RenderTexture在使用完后,记得使用RenderTexture.ReleaseTemporary释放内存,特别是在GameObject销毁的时候

EXample

public void OnDestroy()
{
    RenderTexture.ReleaseTemporary(normalTex);
    RenderTexture.ReleaseTemporary(positionTex);
}

6、多实例情况

实验室的器件是可以同时放置多个的,需要考虑多实例的情况。例如:铝箔燃烧效果,可以拖出多个铝箔,可以使用同一个酒精灯对多个铝箔进行灼烧,多个铝箔之间应当不会产生干扰。

7、不添加没有使用的MonoBehaviour函数

例如:添加了一个Update函数,但是实际该函数没有执行任何操作。会对性能产生一定影响。

8、工具类

对于一些常用的方法,可以提供工具类