Unity3D
Unity基本操作
Unity基本单位为米,ue4是厘米
Rotation 为度,监事面板是角度,代码里计算的结果是弧度
Scale的单位是倍数。负数为左右镜像
创建工程
必要文件夹:
Sences
Scripts
Prefabs
工程结构
Assets所有素材都在里面,迁移必须
Library临时文件库,迁移工程时不拷贝,临时生成
ProjectSettings 项目设置-》projecversion 项目版本号,迁移必须
Temp缓存文件,可以不拷贝。
Meta文件都是unity生成的导入配置信息,例如图片的分辨率,压缩方式,版本控制时,例如svn一般不上传。
X轴旋转到正负90度,会发生万向死锁
组成
Scene(场景)
编辑游戏中所有的内容
右键控制视角,右键+w/s/a/d,对应视角移动操作。
按住鼠标中间切换移动,松开切换回来
Game(游戏窗口)
游戏中真正显示的内容
Project(资源窗口)
包含项目中所有的资源,对应工程下Asset目录
右键-》show in exploder 打开对应文件夹
Hierachy(对象实例化的窗口)
游戏世界中所包含的内容。
Inspector(信息面板、检视面板)
Console(控制台)
Debug.Log();
Unity中视觉窗口所有内容都称为Gameobject
坐标
Unity2d的(0,0)点是game窗口左下角。3d使用左手坐标系。
相对坐标和绝对坐标
库函数
UnityEngine->unity库。
class只有继承了MonoBehaviour才能挂到gameobject身上
DeBug类
日志输出
Log 输出,黑色
LogError 打印红色日志,错误
LogWarning 打印黄色警告日志
属性
name属性是当前脚本所在游戏物体的名字
警告处理
1、如果出现了the referenced(引用) script on this Behaviour is missing ,选中后下发有描述,一般此错误有两种可能,一是脚本被删除,二是脚本名或类名被改变了。
2、如果脚本丢失,建议先删除再重新添加。
3、脚本名必须和类名一致
错误处理
error CS0103: The name `XXX' does not exist in the current context xxx类不存在
error CS1501: No overload for method `xxxx' takes `n' arguments xxxx方法参数数量有误
unity对大小写敏感。
NullReferenceException(异常): Object reference not set to an instance of an object空引用异常
error CS0266: Cannot implicitly convert type `UnityEngine.Component' to `UnityEngine.Transform'. An explicit conversion exists (are you missing a cast?) 不能转换类型
消息函数
不是主动调用,通过消息机制调用的函数。例如start(),update()
SendMessage()发送消息的方法,所有的gameobject对象都可以调用。但不要使用sendmessage,因为效率很低。
生命周期
Awake() 脚本实例化时调用,一般用于初始化,脚本开始只执行一次,Awake在初始化之前调用,在Awake中调用不到其他函数,因为可能还没有初始化。
Start() 脚本第一次启用update前调用(Awake之后执行),也用于初始化,但不同与Awake,后于Awake调用。
Onenble当组件被激活的时候执行(脚本激活时)。
Ondisable当组件被失活的时候执行。
Update() 运行时,每帧调用。屏幕刷新一遍为一帧,人眼为24帧
FixedUpdate() 和update()的帧长不同,FixedUpdate先执行,它的每帧时间完全固定0.02,每帧时间可以在unity中设置,edit中,倒数第三个选项,主要应用于物理受力处理
OnDestroy() 该脚本被移除时调用,同时对应物体被删除时也会调用。(其实还是脚本被删除时调用,删除物体同时也删除了脚本,先删除组件后,再删除物体就不会触发。)
OnGUI(),每一帧调用,和update相同,负责绘制屏幕(game窗口),使用的API是GUI 的类。
物理生命周期
OnCollisionEnter(Collision); 当此collider/rigidbody触发另一个rigidbody/collider时,OnCollisionEnter将被调用
OnCollisionExit(Collision)当此collider/rigidbody停止触发另一个rigidbody/collider时,OnCollisionExit将被调用。
OnCollisionStay(Collision)当此collider/rigidbody触发另一个rigidbody/collider时,OnCollisionStay将会在每一帧被调用。
当Collider(碰撞体)进入trigger(触发器)时调用OnTriggerEnter。 | |
当另一个对象进入到这个对象附加的触发碰撞器时发送消息(仅2D物理)。 | |
当Collider(碰撞体)停止触发trigger(触发器)时调用OnTriggerExit。 | |
当另一个对象离开附加在这个对象的触发碰撞器时发送消息(仅2D物理)。 | |
当碰撞体接触触发器时,OnTriggerStay将在每一帧被调用。 | |
当另一个对象停留在这个对象附加的触发碰撞器内时,每帧发送消息(仅2D物理)。 |
预制体prefab
场景内容是临时存在的,预制体是永久存在的,所以,场景内的物体拖不到预制体的代码中。
创建预制体
将物体直接拖到资源窗口,就能自动创建预制体
游戏中使用预制体的物体,最上方或多出三个属性:select(选中当前使用预制体的文件),apply(应用修改的数据到预制体,所有使用此预制体的物体都会改变),revert点击会恢复默认的预制体数据。
加载预制体
加载预制体,就必须把预制体放在Resources目录下,通过Resources.Load(路径)获取预制体,然后通过Instantiate()实例化。
禁忌:禁止直接使用预制体,因为这样会在运行期间直接修改预制体的数据,停止运行后预制体数据不会还原
Resources目录
该目录属于unity官方指定目录,必须使用此名字,存放资源使用。
一般存放预制体,贴图,音效等内容。
加载通过Resources.Load(“路径及文件名”),或者Resources.Load<T>(路径及文件名);
路径根起点默认为Resources,因此不用写Resources。
例如:Resources.Load<GameObject>(“A”);
加载后需要通过实例方法(Instantiate())添加到世界中。
Instantiate(original: Object, 【position: Vector3, rotation: Quaternion】) 克隆原始物体并返回克隆物体。
Resurces.load是堵塞性加载,加载内容时程序会一直停在这里,加载完成时才会继续往下执行。
Resurces.load加载后,不使用了需要释放掉,否则会一直在内存中加载,使用Resources.UnloadAsset(变量名); 随后变量名一定要置空,否则该变量会变成一个未知指向的野指针。
不要在update中使用Resurces.load
动态资源加载(异步资源加载)
Resources.LoadAsync();异步加载。异步加载不会堵塞主线程
返回ResourceRequest类型的对象,该对象继承于AsynOperation。
AsynOperation中有一个progress进度函数,该值为0-1,常用于场景切换的进度条。
AsynOperation中有属性isDone,是否加载完成
加载完成的资源在ResourceRequest的对象.asset字段中
异步加载常常配合协程使用。
遇到函数Async结尾一定都是异步,sync肯定是同步的。
场景切换
场景类Application类(早期版本使用)
Application.Quit();退出场景,结束游戏
Application.Load ();已弃用。
SceneManager类
使用要先using unityEngine.SceneManager
SceneManager.loadScene(场景索引);
加载场景的异步加载
SceneManager.LoadSceneAsync(场景索引);返回值是asyncOperation类型,也有progress。
异步加载完后会自动跳转场景,不会等待指令。
asyncOperation的allowSceneActiveation属性改为false后,就不会加载完成后自动跳跃了,但此时进度也会永远变不了100%,最大停留在0.9的位置,isDone永远为false,发送跳跃指令后才会完成。
工程与工程之间的资源迁移
导出,再导入
Export package,系统会自动选中所有关联资源