Unity笔记-01
脚本注意事项
一般不写构造函数,Unity3D里,我们通常使用的最多的类就是继承自 MonoBeaver
这个接口的作为组件负载在物件上的类。要知道,构造函数最大的好处之一,就是初始化成员变量。而到Unity3D里头,官方的做法是希望你把成员变量的初始化放在Insector
窗口中设置。如你知道的那样,比如,你写一个Public int Speed
,那么你所附载的组件上找到设置这个Speed的地方。
所以,因为Unity3D的组件化,使得构造函数都失去作用了。因为成员初始化的事已经和他无关了,并且如果随意写构造函数会给带来无法预料的异常结果,因此所有继承MonoBeaver
接口的脚本都不建议写构造函数
代码:public int a;
如果定义公开字段,那么下Unity里会添加对应的公开值,也可以设置初始化值;
代码:[SerializeField] private int a = 100;
序列化字段 作用:在编辑器中显示私有变量;编译器可以操作,但是别的类无法访问
代码:[HideInInspector] public int b;
作用:在编译器中隐藏字段,但是能在别的类里访问它,但是不希望人为去操作
代码:[Range(0,100)] public int c;
作用:给这个值定义范围
脚本生命周期
在Unity中通过菜单设置修改默认的脚本编辑器:
Edit——Preferences——External Tool——External Script Editor
Unity脚本从唤醒到销毁的过程
消息:当满足某种条件Unity引擎自动调用的函数
必然事件;(必然事件/消息,都是脚本生命周期的另外叫法)
初始阶段
//——————————————————————————————初始阶段——————————————————————————————————
//执行时机:创建游戏对象——>立即执行1次 早于Start
//作用:初始化
private void Awake()
{
//此方法可以在UnityConsole界面输出文本
Debug.Log("Awake--" + Time.time+this.name);
print("go");//仅仅在脚本里可以
}
//执行时机:创建游戏对象——>脚本启用——>执行1次
//作用:初始化
Awake
唤醒:
当物体载入时立即调用一次,常用于在游戏开始前进行初始化,可以判断当满足某种条件执行此脚本this.enable=true
.设置脚本的启用和禁用
OnEnable
当可用:
每当脚本对象启用的时候调用
private void Start()
{
Debug.Log("Start--" + Time.time+ this.name);
}
Start开始:
物体载入且脚本对象启用时被调用一次,常用于数据或游戏逻辑的初始化,执行时机晚于Awake
物理阶段
//——————————————————————————————物理阶段——————————————————————————————————
//执行时机:每隔(默认0.02s)固定时间执行一次
//适用性:适合对物体做物理操作(移动,旋转),不会受到渲染影响
private void FixedUpdate()
{
//Debug.Log(Time.time);
}
FixedUpdate
固定更新:
脚本启用后,固定时间被调用,适用于对游戏对象做物理操作,例如移动等
设置更新频率:“Edit”–>“Project Setting”–>“Time”–>“Fixed Timestep” 值,默认0.02s
onCollisionXXX
碰撞:
当满足碰撞条件时调用
onTriggerXXX
触发:
当满足触发条件时调用
游戏逻辑
//——————————————————————————————游戏逻辑——————————————————————————————————
//渲染时间不固定(每帧渲染量不同,机器性能不同)
//执行时机:渲染帧执行,执行间隔不固定,会受到渲染影响
//适用性:处理游戏逻辑
private void Update()
{
//单帧调试
//启动调试,unity中运行场景,VS添加代码,unity暂停,加断点,单帧执行,结束调试
}
Update
更新:
脚本启用后,每次渲染场景时调用,频率与设备性能及渲染量有关;
LateUpdate
延迟更新:
在Update函数被调用后执行,适用于跟随逻辑
输入事件
OnMouseEnter
鼠标移入(当前碰撞器)
OnMouseOver
鼠标经过
OnMouseExit
鼠标离开
OnMouseDown
鼠标按下
OnMouseUp
鼠标抬起
场景渲染
OnBecameVisible
当可见:
当Mesh Renderer在任何相机上可见时调用
OnBecameInvisible
当不可见:
当Mesh Renderer在任何相机上都不可见时调用
结束阶段
OnDisable
当不可用:
对象变为不可用或附属游戏对象非激活状态时此函数被调用
OnDestroy
当销毁:
当脚本销毁或附属游戏对象被销毁时调用
OnApplicationQuit
当程序结束:
应用程序退出时调用
使用Unity编辑器:学会调试
程序台调试:Debug.Log
(变量),print
变量,十分消耗资源消耗CPU,慎用!用完一定要删!
定义共有变量,程序运行后在检测面板检查数据
VS调试:添加断点,启动调试,回到unity启动场景,回到VS调试检查错误;快速监视;即时窗口
单帧调试:启动调试,unity中运行场景,暂停游戏,加断点,单帧执行,结束调试
Unity-API关系图
仅仅学习到的部分,更全的图请自行上网找
Unity常用API
以下笔记仅仅为常用属性和方法,如遇到只是盲点请访问官方文档
Component
该类主要用于获得组件
当脚本挂于一个对象上时,
注意:可以通过对象上挂的脚本类型变量的类型引用获取其他组件类型的引用,同样适用以下方法。
代码:this.GetComponent<E>()
获得对应的E类型组件
代码:this.GetComponents<E>()
可以获得该对象下的所有E类型组件,并返回E[]
数组
代码:var allComponents = this.GetComponents<Component>()
一般用于获得该对象下的所有组件
代码:foreach(var item in allComponents)
遍历集合得到对象下的所有组件
代码:var all = this.GetComponentsInChildren<E>()
可获得除了自身以外所有后代的E类型组件返回E[]
数组。
Transform
通过this.transform
可以获得该对象的变换组件
遍历this.transform
可以获得该对象的子物体的变换组件,例如下面的代码:
foreach(Transform child in this.transform)
{
//为每个子物体的变换组件(不包含自身)
//再通过组件的引用获得子物体的其他组件,例如物体名称,MeshRenderer组件
//例如:
child.GetComponent<MeshRenderer>().material.color = Color.red;
print(child.name);
}
代码:this.transform.Translate(0, 0, 1);
以自身坐标系为基准,向z轴移动一单位
代码:this.transform.Translate(0, 0, 1,Space.World);
以世界坐标系为基准,向z轴移动一单位,注意第四个参数不写就是默认自身坐标系:Space.Self
代码:this.transform.Rotate(0, 10, 0);
以自身坐标系为基准,绕y轴方向顺时针(从上往下)旋转10度,第四个参数同上,也有世界坐标系
代码:this.transform.RotateAround(Vector3.zero,Vector3.up,1);
以自身坐标系为基准,绕自定义轴方向旋转1度,自定义轴需要两个点来决定,因此需要输入两个点,第四个参数同上,也有世界坐标系
代码:Transform Child = this.transform.Find(name);
通过名字寻找获得子物体的变换组件,不能找孙子代之后的物体
代码:Transform Child = this.transform.GetChild(int index);
通过索引寻找获得子物体的变换组件
代码:this.transform.root
获得该物体的根物体
代码:this.transform.parent
获得该物体的父物体
代码:this.transform.SetParent(Transform,flag);
设置父物体,把来源的变换组件给到函数,来源成为this
的父物体
flag=false
表示给到的父物体坐标不为世界坐标,如果为true
那么位置不会改变,如果为false
,那么this的位置将为成为相对父级的坐标因而发生位置改变
代码:DetachChildren
解除子对象的父子关系
代码:SetParent(null)
解除父对象的关系
其他注意点:
在代码里和Unity界面里,所有的this.transform.position
指的都是localposition
也就是相对位置
物体相对于世界坐标系原点的位置 this.transform.position
物体相对于父物体轴心点的位置 this.transform.localPosition
unity里的Scale
指的是相对于父级的缩放比例 localScale
lossyScale
指的是相当于模型的缩放比例
GameObject
注意:只有GameObject
能够New,其他所有组件都不能创建实例
如果想在代码层面添加组件,必须通过GameObject
例如添加光源:
GameObject Game = new GameObject();
Light light = Game.AddComponent<Light>();
light.color = Color.red;
light.type = LightType.Point;
代码:this.gameObject.activeInHierarchy
在场景中物体激活状态(实际状态),只读;
代码:this.gameObject.activeSelf
物体自身激活状态,物体在面板上的激活是否有勾上,只读
代码:this.gameObject.SetActive();
设置物体的启用和禁用
代码:GameObject.Find("游戏对象名称");
在场景中根据名称查找物体(不建议使用,效率极低)
代码:GameObject[] e= GameObject.FindGameObjectsWithTag("Enemy");
获取所有使用该标签的物体,并返回数组
代码:GameObject player = GameObject.FindWithTag("Player");
根据标签寻找单个物体
Object
代码:Object.FindObjectsOfType<E>();
根据类型寻找第一个被激活的E类型对象,并返回E类型
代码:object.FindObjectsOfType<E>();
根据类型寻找所有该类型的对象,返回E类型数组