Unity 开发知识点笔记集合

1.如何查看某个层(layer)有哪些物体:

点击右上角的Layers按钮,通过关闭或者打开眼睛可隐藏或显示设置为某个Layer的所有物体

脚本特性:

void OnValidate()//在Inspector中修改参数值,就会自动调用这个方法

[ExecuteInEditMode]//添加这个以后,Start方法会在添加脚本和点击run或stop的时候执行一遍
[AddComponentMenu("MyTool/MaterialOrder")]  //脚本可以在添加脚本面板添加

#if UNITY_EDITOR
using UnityEditor;//自动调用OnValidate()方法
#endif 
using UnityEngine;
[ExecuteInEditMode]//添加这个以后,Start方法会在添加脚本和点击run或stop的时候执行一遍
[AddComponentMenu("MyTool/MaterialOrder")]
public class MaterialOrder : MonoBehaviour {
    [Range(3000,3300)]
    public int renderLayer = 3000;
 
    void Start()
    {
        ChangeQueue(renderLayer);
    }
#if UNITY_EDITOR
    void OnValidate()//在Inspector中修改参数值,就会自动调用这个方法
    {
        ChangeQueue(renderLayer);
    }
#endif
    void ChangeQueue(int layer)
    {
        if (layer >= 3300) layer = 3300;
        gameObject.GetComponent<Renderer>().sharedMaterial.renderQueue = layer;
    }
}

LayerMask

LayerMask实际上是一个位码操作,在Unity3D中一共有32个Layer层,并且不可增加。

位运算符

按位运算符:~、|、&、^。位运算符主要用来对二进制位进行操作。

逻辑运算符:&&、||、!。逻辑运算符把语句连接成更复杂的复杂语句。

按位运算符:左移运算符<<,左移表示乘以2,左移多少位表示乘以2的几次幂。

扫描二维码关注公众号,回复: 5342958 查看本文章

LayerMask mask = 1 << 2; 表示开启Layer2。

LayerMask mask = 0 << 5;表示关闭Layer5。

LayerMask mask = 1<<2|1<<8;表示开启Layer2和Layer8。

LayerMask mask = 0<<3|0<<7;表示关闭Layer3和Layer7。

上面也可以写成:

LayerMask mask = ~(1<<3|1<<7);表示关闭Layer3和Layer7。

LayerMask mask = 1<<2|0<<4;表示开启Layer2并且同时关闭Layer4.

public class example : MonoBehaviour {  
    LayerMask mask =  ~(1<<3|1<<7);  
    void Update() {  
        if (Physics.Raycast(transform.position, transform.forward, 100, mask.value))  
            Debug.Log("Hit something");  
  
    }  
} 

2.运行模式下可动态设置 physicsManager 下的Layer Collision Matrix : 在这里可以设置物体 分层碰撞

3.关闭日志输出:Debug.logger.logEnabled=false; 为输出日志添加回调函数:Application.logMessageReceived+=LogMessageReceivedFunc;使用 ILoggerHandle的子类讲Debug.Log的默认输出替换成可控的函数。

4.快捷高效替换UI,在编辑器外面替换掉原有UI,名字保持不变,不要删除 .meta文件,可实现替换掉所有引用到此图片的UI贴图

5.  [SerializeField]表示将原本不会被序列化的私有变量和保护变量变成可以被序列化的,那么它们在下次读取的值就是你上次赋值的值。[HideInInspector]表示将原本显示在面板上的序列化值隐藏起来。凡是显示在Inspector 中的属性都同时具有Serialize功能(序列化的意思是说再次读取Unity时序列化的变量是有值的,不需要你再次去赋值,因为它已经被保存下来)。

Serializable是.Net自带的序列化

有时候我们会自定义一些单独的class/struct, 由于这些类并没有从 MonoBehavior 派生所以默认并不被Unity3D识别为可以Serialize的结构。自然也就不会在Inspector中显示。我们可以通过添加 [System.Serializable]这个Attribute使Unity3D检测并注册这些类为可Serialize的类型。具体做法如下:

[System.Serializable] 
public class FooBar { 
public int foo = 5; 
public int bar = 10; 

注意:Serializable只可以对class,struct,enum,delegate进行序列化,不可以对属性序列化

他人:https://blog.csdn.net/obarong/article/details/68924413

猜你喜欢

转载自blog.csdn.net/lizhenxiqnmlgb/article/details/85281323
今日推荐