unity3d学习笔记

《unity3d学习笔记》--擅码网unity视频教程


一、新手入门


1、unity3d环境搭建


unity是游戏开发引擎。


unity3d能做什么:

游戏开发(手游)

游戏开发(页游)

VR、AR、仿真


学习unity3d需要哪些基础:

C#(硬性)--60%

英语(软性)--30%

数学(软性)--10%


unity3d官网:https://unity3d.com/cn


2、游戏场景的基本操作


项目的存储结构:

Assets:资源文件夹

Library:库文件夹

ProjectSettings:项目设置文件夹

Temp:临时文件夹


Assets文件夹结构:

Scenes:场景

Materials:材质球

Textures:贴图

Prefabs:预设体

Scripts:脚本


鼠标功能:

左键:选中物体

中键:平移场景/缩放场景

右键:旋转场景

alt+鼠标左键:旋转场景

alt+鼠标右键:缩放场景


工具栏操作:平移场景、移动物体、旋转物体、缩放物体

工具栏快捷键对应:q w e r


一个游戏项目由多个场景组成,而每个场景有多个游戏物体组成。


3、游戏场景制作3D模型


尺寸:1米

方向:

世界坐标系(Global)

物体自身坐标系(Local)


ctrl+d:复制物体

f或双击层级面板的物体名称:聚焦物体

工具栏快捷键对应:q w e r


4、3D模型美化之材质球


材质球放在Materials文件夹,材质球文件的扩展名为.mat。

贴图放在Textures文件夹


创建材质球:在Materials文件夹下右击-》Create-》Material

贴图只要拖入Textures文件夹


5、3D模型重用之预制体


可以用空物体来管理其它物体。


预制体放在Prefabs文件夹,把物体拖入Assets或Prefabs文件夹就是预制体。

编辑其中一个,点击Apply(Inspector面板-》Prefab选项),所有都会改变。


预制体文件的扩展名为.prefab。


6、基本组件之摄像机(Camera)


场景美化:添加地板

材质球的Tilling属性:分块


Game视图:游戏预览或运行窗口

游戏处于运行状态时所做的修改不会被保留。


摄像机常用操作

GameObject-》Align With View(ctrl+shift+f):让摄像机对齐当前视图

摄像机常用属性(摄像机的Camera组件)

Clear Flags:清除标记。

Background:背景颜色,Clear Flags设置为Solid Color时有效。

Clipping Planes:切割面


7、基本组件之灯光(Light)


显示/隐藏游戏物体:Inspector面板图标右侧复选框。


方向光(Directional Light):模拟太阳光

常用属性:Type、Color、Intensity(强度)、Shadow Type


点光源(Point Light):模拟电灯泡

常用属性:Range(范围)


聚光灯(Spot Light)

常用属性:Spot Angle(照射角度)


8、组件与脚本


Transform组件(变换)的属性

Position:位置

Rotation:旋转

Scale:缩放


C#脚本,用于控制游戏的逻辑。

脚本文件放在Scripts文件夹。


void Start(){}  //游戏运行时执行一次,事件方法

void Upadte(){}  //每帧执行一次,1秒大概60次,事件方法


Debug.Log()  //调试输出


9、鼠标键盘输入


Input.GetKey():获取键盘按下某键。

Input.GetKeyDown():获取键盘按下某键瞬间。

Input.GetKeyUp():获取键盘释放某键瞬间。

参数KeyCode


Input.GetMouseButton():获取鼠标按下某键。

Input.GetMouseButtonDown():获取鼠标按下某键瞬间。

Input.GetMouseButtonUp():获取鼠标释放某键瞬间。

0--左键  1--右键  2--中键


10、使用变换组件移动游戏物体


gameObject:当前游戏物体


GameObject类

GetComponent<T>():获取组件对象


Transform类

Translate(Vector3,Space):移动游戏物体,默认按自身坐标的相对坐标。position:设置位置,按世界坐标的最终坐标。

Rotate():相对坐标,默认按自身坐标;localEulerAngles:设置旋转,按世界坐标的相对于父物体的坐标;eulerAngles:按世界坐标的最终坐标;rotation:按自身坐标,取值为Quaternion类型。

localScale:设置缩放,按自身坐标的最终坐标。


Vector3.forward

Vector3.back

Vector3.left

Vector3.right


Space.Self

Space.World




11、物理组件之刚体


刚体组件(Rigidbody):有了重力等物理属性


添加刚体组件

选中物体-》菜单Component-》Physics-》Rigidbody


刚体组件的属性

mass:质量

drag:阻力

angular drag:角阻力

use gravity:是否使用重力


使用刚体移动物体

Rigidbody组件类的MovePosition(Vector3)方法,按世界坐标系,方向要用当前位置+方向。


12、物理组件之碰撞体


碰撞体(collider):物体之间产生碰撞。

模型、碰撞体、刚体


添加碰撞体组件:

选中物体-》菜单Component-》Physics-》xxx Collider


box collider属性

center:中心点

size:尺寸


sphere collider属性

radius:半径


capsule collider属性

height:高度

direction:高度的方向


mesh collider属性

mesh:指定生成碰撞体的网格


13、刚体常用方法介绍


AddForce():给刚体添加一个力,按世界坐标系。

语法为:

AddForce(Vector3,ForceMode)

说明:

(1)Vector3:设置力的方向和大小。

(2)ForceMode:设置力的模式,枚举型。

常用的ForceMode.Force

例:AddForce(Vector3.forward*10,ForceMode.Force)


AddRelativeForce():给刚体添加一个力,按自身坐标系。

语法为:

AddRelativeForce(Vector3,ForceMode)

说明:

(1)Vector3:设置力的方向和大小。

(2)ForceMode:设置力的模式,枚举型。

常用的ForceMode.Force

例:AddRelativeForce(Vector3.forward*10,ForceMode.Force)


velocity:设置速度,参数Vector3类型。按世界坐标系。


void FixedUpdate(){}:固定更新方法,默认时间间隔0.02秒,用于执行物理操作。

MonoBehaviour类的事件方法。


14、刚体碰撞事件监测与处理


碰撞事件监测方法


OnCollisionEnter(Collision coll):碰撞开始,执行一次,事件方法

coll.gameObject:与当前物体碰撞的物体

coll.gameObject.name:与当前物体碰撞的物体的名称


OnCollisionExit(Collision coll):碰撞结束,执行一次,事件方法


OnCollisionStay(Collision coll):碰撞进行中,多次执行,事件方法


15、刚体触发事件监测与处理


碰撞体变为触发器:勾选“Is Trigger”选项。


触发事件监测方法

OnTriggerEnter(Collider coll):进入触发范围,执行一次,事件方法

coll.gameObject:与当前物体接触的物体

coll.gameObject.name:与当前物体接触的物体的名称


OnTriggerExit(Collider coll):离开触发范围,执行一次,事件方法


OnTriggerStay(Collider coll):在触发范围内,多次执行,事件方法


16、网络组件之网格过滤器和渲染器


网格过滤器(Mesh Filter)


网格渲染器(Mesh Renderer)


17、疯狂教室案例开发上


模型中心点的改变:利用空物体


中心点工具

Pivot:中心点在后选物体上

Center:中心点在两个物体中间


物体旋转

Transform组件类的Rotate(Vector3,float)方法

例如:m_Transform.Rotate(Vector3.up,90)


查找物体

GameObject.Find(string):静态方法,参数为物体名称。

GameObject.FindWithTag(string)

GameObject.FindGameObjectWithTag(string)

GameObject.FindGameObjectsWithTag(string)

GameObject.FindObjectOfType<T>()

GameObject.FindObjectsOfType<T>()


18、疯狂教室案例开发下


为物体设置tag:Inspector面板》Tag


通过Tag查找多个物体

GameObject.FindGameObjectsWithTag(string)

返回GameObject[]数组


19、PC端游戏打包与发布


File》Build Settings


20、新手入门总结




二、新手进阶


1、旧版UI组件之GUIText


UI就是用户操作界面。


常用UI系统:NGUI、UGUI


旧版UI有两个组件:GUIText和GUITexture


GUIText:文字

位于Component》Rendering

只能在Game视图可以看到


2、旧版UI组件之GUITexture


GUITexture:图像

位于Component》Rendering

只能在Game视图可以看到


鼠标事件方法

void OnMouseEnter():鼠标进入

void OnMouseExit():鼠标移开

void OnMouseDown():鼠标点击

void OnMouseUp():鼠标释放

void OnMouseDrag():鼠标拖动


3、特效组件之TrailRenderer


拖尾渲染器,用于显示拖尾特效。

位于Component》Effects》TrailRenderer

在Scene视图拖动物体可以看到拖尾效果

物体应用TrailRenderer:先把组件附加到空物体,然后空物体作为子物体


属性

Materials:材质球

Time:消失时间

Width:宽度

Color:颜色


制作透明材质球:设置材质球的Shader为Particles/Additive(粒子/添加物),再给材质球赋予贴图(白色显示,黑色不显示)。


4、特效组件之LineRenderer


线渲染器,用于显示“线特效”。类似激光笔效果。

位于Component》Effects》LineRenderer


常用属性有:

Positions:设置位置。

Width:设置宽度。

Color:设置颜色。


5、声音组件之AudioSource


unity支持的音频格式:mp3、wav、ogg、aif


音频文件存放到文件夹Audios中。


AudioSource:音频源组件

位于Component》Audio》AudioSource


常用属性有:

AudioClip:设置音频剪辑。

Play On Awake:设置在唤醒时播放。

Loop:设置是否循环。

Mute:设置静音。

Volume:设置音量。

Spatial Blend:设置是2D声音还是3D声音。3D声音有空间变化。


AudioListener:声音侦听组件

位于Component》Audio》AudioListener



AudioSource组件类的常用方法:

Play():播放

Stop():停止

Pause():暂停


6、常用API之实例化与销毁


实例化

GameObject.Instantiate(Object,Vector3,Quaternion)

Object:实例化的物体

Vector3:放置的位置

Quaternion:设置旋转,四元数,Quaternion.identity为无旋转。


销毁

GameObject.Destroy(Object[,float])

Object:销毁的物体

float:设置销毁时间



Random.Range(min,max):生成随机数。


7、常用API之Invoke函数调用


Invoke(string,float)

多少秒后执行某个函数(只会调用一次)。


InvokeRepeating(string,float,float)

多少秒后重复执行某个函数。

第一个float为开始时间

第二个float为间隔时间


CancelInvoke()

取消本脚本中所有Invoke执行。


以上三个函数为类MonoBehaviour的方法


8、常用API之消息发送


gameObject.SendMessage(string)

执行物体上脚本组件中的公有方法

也可以用

gameObject.getComponent<脚本组件>().公有方法()


9、常用API之协同程序


协程不是线程。

只有在继承了“MonoBehaviour”这个类的子类中才能使用协程。


//协同程序

IEnumerator Task3(){

  yield return new WaitForSeconds(2);

  Debug.Log("任务3");

}


StartCoroutine("协程名"); //调用协同程序


StopCoroutine("协程名"); //停止协同程序


StopAllCoroutines(); //停止所有协同程序