1.在使用Canvas中布局组件是得不到修改该后的效果
///官方解释:
///强制所有画布更新其内容。
///画布在帧末尾、即将渲染前执行其布局和内容生成计算,以确保计算基于该帧期间可能发生的所有最新更改。也就是说,在 Start 回调和第一个 Update 回调中,画布下的布局和内容可能不是最新的。
///依赖于最新布局或内容的代码可以调用该方法,以确保它在依赖它的代码前执行。
Canvas.ForceUpdateCanvases() //强制刷新Canvas页面
//方法二 版本2018.4.2f1
//刷新操作对象的上级布局组件
IEnumerator UpdateLayout(RectTransform rect)
{
LayoutRebuilder.ForceRebuildLayoutImmediate(rect);
yield return new WaitForEndOfFrame();
Vector3 vecScale = rect.localScale;
float width = rect.rect.width;
float height = rect.rect.height;
while (rect.rect.width == 0)
{
Debug.Log(rect.rect.width);
LayoutRebuilder.ForceRebuildLayoutImmediate(rect);
yield return new WaitForEndOfFrame();
}
}
2.判断对象为空使用其他方式进行优化 参考内容
///普通使用
if (gameObject == null)
{}
///使用优化方法
if (System.Object.ReferenceEquals(gameObject, null))
{}
3.判断对象的标签不使用 “ . ” 来点出Tag()
///普通使用
Gameobject.tag()
///使用优化方法
Gameobject.CompareTag()
4.在性能不敏感的时期主动出发垃圾回收(System.GC.Collect方法),比如在切换场景,暂停游戏时等。
System.GC.Collect()
5.World Canvas
为World Canvas指定一个Camera,否则它会每帧都执行Camera.Main,而Camera.Main会持续调用Gameobj.Find方法
6.UnityObject的InstanceID
必要情况下,在Dictionary的键中,我们要缓存Unity对象时,使用UnityObject的InstanceID来作为字典的键,而不是直接使用Object的引用。
7.比较
==它是比较的栈里面的值是否相等(值比较)
Equals它比较的是堆里面的值是否相等(引用地址值比较)
Object.ReferenceEquals(obj1,obj2)它是比较的是内存地址是否相等
8.颜色编码和Color之间的转换。待验证
Color color = ColorUtility.ToHtmlStringRGB(strcolor);
private Color GetColor(string colorcode)
{
Color color;
StringBuilder sb = new StringBuilder("#");
sb.Append(colorcode);
ColorUtility.TryParseHtmlString(sb.ToString(), out color);
return color;
}
9.在计算向量夹角时总是会得到0~180内 ,参考内容
/// <summary>
/// Determine the signed angle between two vectors, with normal 'n'
/// as the rotation axis.
/// </summary>
public static float AngleSigned(Vector3 v1, Vector3 v2, Vector3 n)
{
return Mathf.Atan2(
Vector3.Dot(n, Vector3.Cross(v1, v2)),
Vector3.Dot(v1, v2)) * Mathf.Rad2Deg;
}
10.在使用Video Player和Audio Source 时没有声音,重置DSP设置为此状态。