惠州专业做网站公司,网页升级紧急通知怎么设置,一个WordPress多个域名,网站做端口是什么1. 空Unity消息 Unity消息被运行时事件调用#xff0c;即使消息体为空也会被调用。因此#xff0c;删除空消息避免不必要的处理。
例如#xff1a;
using UnityEngine;class Camera : MonoBehaviour
{private void FixedUpdate(){}private void Foo(){}
}
应该删除未使用…1. 空Unity消息 Unity消息被运行时事件调用即使消息体为空也会被调用。因此删除空消息避免不必要的处理。
例如
using UnityEngine;class Camera : MonoBehaviour
{private void FixedUpdate(){}private void Foo(){}
}
应该删除未使用的 FixedUpdate 方法。
2. 标签比较效率低下 使用“”进行标签比较效率要比使用内置的“CompareTag ”方法比较的效率低所以尽量使用“CompareTag ”进行标签比较。
例如
using UnityEngine;public class Camera : MonoBehaviour
{private void Update(){Debug.Log(tag tag1);}
}改为using UnityEngine;public class Camera : MonoBehaviour
{private void Update(){Debug.Log(CompareTag(tag1));}
}
3. 非通用GetComponent的用法 为了类型安全首选使用GetComponent、TryGetComponent、GetComponents、GetComponentInChildren、GetComponentsInChildren、GetComponentInParent和GetComponentsInParent的泛型形式。
例如
using UnityEngine;class Camera : MonoBehaviour
{private Rigidbody rb;private void Start(){rb GetComponent(typeof(Rigidbody)) as Rigidbody;}
}改为using UnityEngine;class Camera : MonoBehaviour
{private Rigidbody rb;private void Start(){rb GetComponentRigidbody();}
}
4. Time.fixedDeltaTime 和 Update 一起使用时 Update 是依赖于帧率的在Update中 应该用 Time.deltaTime 而不是用 Time.fixedDeltaTime。 同理FixedUpdate 不依赖帧率在 FixedUpdate 中 应该用Time.fixedDeltaTime而不是 Time.deltaTime。
5. Unity对象上的空合并 Unity 重写了Unity对象的null比较运算符因此不要对Unity对象使用null合并运算符??同理也不要对Unity 对象使用null传递运算符?.is not null 也是不允许的
他们是不兼容的。
例如
例1
using UnityEngine;class Camera : MonoBehaviour
{public Transform a;public Transform b;public Transform NC(){return a ?? b;}
}改为using UnityEngine;class Camera : MonoBehaviour
{public Transform a;public Transform b;public Transform NC(){return a ! null ? a : b;}
}例2using UnityEngine;class Camera : MonoBehaviour
{public Transform NP(){return transform?.transform;}
}改为using UnityEngine;class Camera : MonoBehaviour
{public Transform NP(){return transform ! null ? transform : null;}
}例3using UnityEngine;class Camera : MonoBehaviour
{public Transform a null;public void Update(){if (a is not null) { }}
}改为using UnityEngine;class Camera : MonoBehaviour
{public Transform a null;public void Update(){if (a ! null) { }}
}
6. 缺少InitializeOnLoad的静态构造函数 在类上使用 InitializeOnLoad 属性标记的时候应该提供静态的构造函数它将在编辑器启动的时候调用。
using UnityEngine;
using UnityEditor;[InitializeOnLoad]
class Camera : MonoBehaviour
{
}改为using UnityEngine;
using UnityEditor;[InitializeOnLoad]
class Camera : MonoBehaviour
{static Camera(){}
}
7. 组件实例创建 组件实例创建时应该使用 AddComponent() 方法将组件添加到一个物体上而不是使用 new 来创建实例。
using UnityEngine;class Foo : MonoBehaviour { }class Camera : MonoBehaviour
{public void Update() {Foo foo new Foo();}
}改为using UnityEngine;class Foo : MonoBehaviour { }class Camera : MonoBehaviour
{public void Update() {Foo foo gameObject.AddComponentFoo();}
}
8. ScriptableObject 实例的创建 使用 CreateInstance() 方法创建 ScriptableObject 的实例而不是使用new。
using UnityEngine;class Foo : ScriptableObject { }class Camera : MonoBehaviour
{public void Update() {Foo foo new Foo();}
}改为using UnityEngine;class Foo : ScriptableObject { }class Camera : MonoBehaviour
{public void Update() {Foo foo ScriptableObject.CreateInstanceFoo();}
}
9. SerializeField 属性无效或冗余 SerializeField 属性对于公共字段是多余的对于属性或静态/只读字段无效。与 SerializeReference 不同编译器允许您在属性上使用 SerializeField 属性即使该属性无效且无法在 Unity 编辑器中运行。
using System.Collections;
using UnityEngine;public class SerializedAttributes : MonoBehaviour
{[SerializeField] // correct usageprivate string privateField;[SerializeField] // redundant usagepublic string publicField;[SerializeField] // invalid usageprivate string PrivateProperty { get; set; }[SerializeField] // invalid usagestatic string staticField;[SerializeField] // invalid usagereadonly field readonlyField;
}改为using System.Collections;
using UnityEngine;public class SerializedAttributes : MonoBehaviour
{[SerializeField] // correct usageprivate string privateField;public string publicField;private string PrivateProperty { get; set; }static string staticField;readonly field readonlyField;
}
10. InitializeOnLoadMethod、RuntimeInitializeOnLoadMethod 或 DidReloadScripts 属性的方法签名不正确
InitializeOnLoadMethod、RuntimeInitializeOnLoadMethod 或 DidReloadScripts 修饰的方法或者属性必须是无参的否则Unity 不会调用它或抛出 NullReferenceException。
using UnityEditor;class Loader
{[InitializeOnLoadMethod]private void OnLoad(int foo, string bar) {}
}改为using UnityEditor;class Loader
{[InitializeOnLoadMethod]private static void OnLoad() {}
}
11. 获取方法名称的不安全方式 使用Invoke、InvokeRepeating、CancelInvoke或StartCoroutine且StopCoroutine第一个参数是字符串文字不是类型安全的。相反建议使用nameof运算符或直接调用协程。这样做的另一个好处是该方法能够使用重命名重构而无需记住更新字符串文字。
using UnityEngine;
using System.Collections;class Camera : MonoBehaviour
{void Start(){Invoke(InvokeMe, 10.0f)StartCoroutine(MyCoroutine);}private void InvokeMe(){// ...}private IEnumerator MyCoroutine(){// ...}
}改为using UnityEngine;
using System.Collections;class Camera : MonoBehaviour
{void Start(){Invoke(nameof(InvokeMe), 10.0f)StartCoroutine(MyCoroutine());}private void InvokeMe(){// ...}private IEnumerator MyCoroutine(){// ...}
}
12. SetPixels 调用很慢
Unity 对 RGBA 颜色使用两种不同的表示形式
Color每个颜色分量都是一个浮点值范围从 0 到 1。这种格式在所有显卡和着色器内部使用。Color32每个颜色分量都是一个字节值范围从 0 到 255。32 位 RGBA。
Color32速度更快内存使用量减少 4 倍。Color与Color32可以隐式地相互转换。
与 SetPixels相比SetPixels32速度更快并且使用更少的内存。
using UnityEngine;public class ExampleClass : MonoBehaviour
{void Start(){Renderer rend GetComponentRenderer();Texture2D texture Instantiate(rend.material.mainTexture) as Texture2D;rend.material.mainTexture texture;// ...Color[] colors new Color[3];colors[0] Color.red;colors[1] Color.green;colors[2] Color.blue;texture.SetPixels(colors);// ...}
} 上例中如果 32 位 RGBA 与您的场景兼容请改用SetPixels32。
13. 在关键信息中System.Reflection 特性的性能 不要在关键消息如 Update, FixedUpdate, LateUpdate, or OnGUI中使用System.ReflectionSystem.Reflection会很慢可能导致滞后。 如果一定要使用 System.Reflection可以在Start或者 Awake中缓存一个变量然后在关键信息中使用缓存的变量。
14. 对 GameObject.gameObject 进行不必要的间接调用 Unity GameObject有一个gameObject的属性它会返回 this。GameObject.gameObject.gameObject这样类似的调用是多余的并且会影响性能。
15. 设置位置和旋转效率低下 出于性能原因考虑Transform/TransformAccess应该尽可能少的访问如果需要依次设置Postion和Rotation可以使用 SetPositionAndRotation() 方法代替。同样依次设置localPosition和localRotation也可以用SetLocalPositionAndRotation()方法代替。 相反如果依次获取position和Rotation也可以用GetPositionAndRotation()方法代替。Local 同理。
using UnityEngine;class Camera : MonoBehaviour
{void Update(){transform.position new Vector3(0.0f, 1.0f, 0.0f);transform.rotation transform.rotation;}
}改为using UnityEngine;class Camera : MonoBehaviour
{void Update(){transform.SetPositionAndRotation(new Vector3(0.0f, 1.0f, 0.0f), transform.rotation);}
}
16. 标量计算优先于矢量计算 在紧密循环或性能关键部分中工作时请记住标量数学比向量数学更快。因此只要交换或关联算术允许就尝试最小化各个数学运算的成本。您可以在这里查看Unity 网站上的相关文档。
using UnityEngine;class Camera : MonoBehaviour
{public void Compute(){Vector3 x;float a, b;Vector3 slow a * x * b;}
}改为using UnityEngine;class Camera : MonoBehaviour
{public void Compute(){Vector3 x;float a, b;Vector3 fast a * b * x;}
}
17. GetComponent 总是分配 Component.TryGetComponent或者GameObject.TryGetComponent将尝试检索给定类型的组件。与 GetComponent相比最大的区别是当请求的组件不存在时此方法不会分配。也就是说如果确定类型存在可以使用GetComponent 获取组件如果可能获取不到类型尽量使用TryGetComponent来获取组件。
using UnityEngine;class Camera : MonoBehaviour
{public void Update() {var rb gameObject.GetComponentRigidbody();if (rb ! null) {Debug.Log(rb.name);}}
}改为using UnityEngine;class Camera : MonoBehaviour
{public void Update() {if (gameObject.TryGetComponentRigidbody(out var rb)) {Debug.Log(rb.name);}}
}
18. 使用非分配物理 API 引入了物理查询 API 的非分配版本。您可以将RaycastAll调用替换为RaycastNonAlloc将SphereCastAll调用替换为SphereCastNonAlloc等等。您可以重复使用预先分配的数组来存储结果而不是为每个调用分配一个新数组。这将提高性能特别是对于频繁的调用。
using UnityEngine;class Camera : MonoBehaviour
{void Update() {var result Physics.RaycastAll(Vector3.zero, Vector3.zero);// ...result Physics.RaycastAll(Vector3.zero, Vector3.zero);}
}