Unity脚本生命周期重要方法:
Awake
Start
FixedUpdate
Update
LateUpdate
OnGUI
OnDisable
OnDestroy
获取本地时间,引入System命名空间
DateTime NowTime = DateTime.Now.ToLocalTime();
DateTime NowTime = DateTime.Now;
Unity四元数与欧拉角之间转换
1.四元数转化成欧拉角
Vector3 v3=transform.rotation.eulerAngles;
2.四元数转化成方向向量
Vector3 vector3= (transform.rotation * Vector3.forward).normalized;
3.欧拉角转换成四元数
Quaternion rotation = Quaternion.Euler(vector3);
4.欧拉角转换成方向向量
Vector3 v3 = (Quaternion.Euler(vector3) * Vector3.forward).normalized;
5.将方向向量转换为四元数
Quaternion rotation =Quaternion.LookRotation(vector3);
6.将方向向量转换为欧拉角
Vector3 v3 =Quaternion.LookRotation(vector3).eulerAngles;
Unity 屏幕坐标 和 世界坐标 之间相互转换
1.世界坐标转屏幕坐标:
Vector3 screenPos = Camera.main.WorldToScreenPoint(pos);
2.屏幕坐标转世界坐标:
Vector3 worldPos = Camera.main.ScreenToWorldPoint(pos);
修改天空盒
RenderSettings.skybox = Skymaterial;
MainCamera添加Skybox组件
求两个向量的夹角和法线向量
1.Vector3.Angle(Vector3 v1,Vector3 v2)
2.Vector3.Dot(Vector3 v3,Vector3 v4)
Mathf.Acos(float) * Mathf.Rad2Deg
Vector3.Cross(Vector3 v5,Vector3 v6)
获取某个物体的子物体
1.transform.GetComponentInChildren<component>(bool)
bool值控制是否选择未激活的子物体
2.transform.childCount
获取某个物体的子物体数量
3.transform.GetSiblingIndex()
获取当前对象的索引值
RayCast Target触发原理
在Unity中UI事件会在EventSystem在Update的Process触发。
UGUI会遍历屏幕中所有RaycastTarget是true的UI,接着发出射线,并且排序找到玩家最先触发的UI,再抛出事件给逻辑层响应。勾选RaycastTarget,会消耗性能。
场景切换
在脚本内引入命名空间:using UnityEngine.SceneManagement;
执行代码: SceneManager.LoadScene
参数填场景名字或BuildSetting中对应的索引值
SceneManagement.SceneManager.GetActiveScene().buildIndex
返回当前Scene的索引
加载新场景不销毁特定物体
Unity中进行场景切换,上一个场景中的所有游戏对象默认都会被销毁。当我们想保留控制全局的游戏对象或者脚本时,可以使用代码控制切换场景时不被销毁。
public static void DontDestroyOnLoad (Object target);
常见报错
1.NullReferenceException:空指针异常
2.UnassignReferenceException:未赋值异常
3.MissingComponentException:组件丢失异常
4.IndexOutOfRange:数组越界异常
判断运行平台
1.宏定义判断:
#if UNITY_ANDROID
#endif
#if UNITY_IPHONE
#endif
#if UNITY_STANDALONE_WIN
#endif
2.Application.platform判断:
Application.platform == RuntimePlatform.Android
Application.platform == RuntimePlatform.IPhonePlayer
Application.platform == RuntimePlatform.WindowsEditor
单例模式
单例模式(Singleton Pattern) 保证一个类仅有一个实例,并提供一个访问它的全局访问点。
单例模式核心在于对于某个单例类,在系统中同时只存在唯一一个实例,并且该实例容易被外界所访问;因为在内存中只有一个实例,减少了内存开销;
获取对象
1.public static GameObject Find(string name);
遍历整个当前场景,效率偏低。
只能获取处于 激活状态 的游戏对象,返回值类型是GameObject类型。
2.public Transform Find(string name);
只查找自己本身以及自己的子对象,效率较高。
可以获取处于 激活/非激活状态 的游戏对象,返回值类型是Transform 类型。
朝向控制
1.LookAt
transform.LookAt(targetPos);
2.方向向量
transform.forward = targetPos.position -transform.position;
碰撞盒检测
Physics.OverlapBox
Physics.OverlapCapsule
Physics.OverlapSphere
线框绘制函数:
private void OnDrawGizmos()
Gizmos.DrawWireSphere
Exists方法筛选List对象
在C#的List集合操作中,有时需要根据条件判断List集合中是否存在符合条件的元素对象。此时可以使用 List集合的扩展方法 Exists方法,通过Exists判断比使or循环或者foreach遍历查找更直接。
取随机数
Random.Range 返回介于min和max之间的随机整数(只读)
(1)float类型重载 随机值包括最小值和最大值 [min,max]
(2)int类型重载 随机值只包括最小值,不包括最大值 [min,max)
碰撞检测
RigidBody刚体是一个判断是否实现碰撞的标志。
OnCollisionEnter方法,要求碰撞的发起方必须拥有刚体。
OnTriggerEnter方法,只需要碰撞双方有一个具有刚体即可触发。
Object类
gameobject通常情况都可以省略不写,例如this.gameobject.transform()
所有的C#对象都是继承于object类,包括int、float这些函数类型,当然也包括Monobehaviour、GameObject这些类。
物体操作
获取到某一根节点下物体代码:
xxxRoot.transform.GetChild(i).gameobject
比较物体标签Tag:
gameobject.compareTag("xxx")
物体隐藏:
gameobject.setActive(true or false)
组件隐藏
component.enabled = true or false