Unity入门总结(1)

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

猜你喜欢

转载自blog.csdn.net/weixin_51669718/article/details/127671145