一.Unity六大模块
首先,Unity界面有六大模块,分别是:Hierarchy,Scene,Game,Inspector,Project,Console。下面对这六个视图的功能进行详解。
1.Hierarchy:层级视图
功能:显示当前场景或多个场景内的所有游戏对象,并表达对象之间的层级关系。
2.Scene:场景视图
功能:显示当前场景的所有游戏对象,并显示场景及游戏对象的基本操作
场景操作:Q(场景移动)、Alt+鼠标左键(场景旋转)、2D/3D、鼠标滚轮(拉近拉远场景)、鼠标右键+WASD(场景漫游)
对象操作:W(对象拖动)、E(对象旋转)、R(对象缩放)、T(2D宽高设置)、F(聚焦游戏对象到屏幕*)、Z(设置中心点:pivot(模型原型中心点)、Center(Unity计算的中心点))、X(设置游戏对象方位:Local(自身的上下左右前后)、Global(世界的上下左右前后))、Ctrl+Shift+F(设置当前选中的游戏对象到观察位置,不仅仅应用于摄像机)
3.Game:游戏视图
功能:显示最终玩家看到的游戏画面
Gizmos:在Game视图显示辅助线及图标
4.Inspector:监视器面板
功能:监视游戏对象、文件、工程设置
监视游戏对象属性:游戏对象图标、激活状态、名称、静态、标签、层、组件
5.Project:工程界面
功能:显示当前工程的Assets文件夹,掌握搜索功能
6.Console:控制台面板
功能:显示提示信息、警告信息、错误信息
二.Unity脚本
1.Unity工程架构
Assets:存储工程所需的所有资源文件
Library:工程所需要的所有资源库(类库)(自动生成)
ProjectSetting:工程设置文件(可移植)
Temp:临时文件
2.Unity开发框架
项目-->场景-->对象-->组件-->属性
3.Unity脚本支持的语言
C#、JS
4.Unity脚本生命周期(9个回调函数)
Awake():游戏开始时最先执行,不受组件可用性的影响,用于游戏对象的初始化
OnEnable():脚本组件可用时执行一次
Start():在OnEnable之后执行一次,受组件可用性的影响,用于更新游戏场景和状态
FixedUpdate():每个一定时间间隔执行一次,通常用于物理状态更新
Update():每帧执行一次
LateUpdate():在Update之后执行,每帧调用一次,用于更新游戏场景和状态,和相机有关的更新一般放在这里
OnGui():每帧执行两次(接近两次),渲染LegencyGui(旧版UI)
OnDisable():脚本不可用时执行一次
OnDestroy():脚本组件被销毁时执行一次
5.调试方式
打印:Debug.Log()
print() 脚本必须继承MonoBehaviour
划线:DrawLine(Vector3 start,Vector3 end);
DrawRay(Vector3 start,Vector3 dir);
三.常用类
1.GameObject
属性:transform、name、tag、layer、activeSelf
方法:
成员方法:SetActive、GetComponent(这一系列)、CompareTag
静态方法:Find、FindWithTag、FindGameObjectsWithTag、CreatePrimitive(创建一个基础对象(Cube、Sphere等))
2.Transform
功能:控制游戏对象的变换
维持父子关系
属性:
控制游戏对象的变换:
position(相对于世界原点,给组件的某个属性赋一个具体的值)、localPosition(相对于父物体)
enlerAngles(相对于世界坐标,旋转顺序为先X,后Y,最后为Z,给组件添加一个具体的值)、localEulerAngles(表示一个物体旋转的角度)
rotation、localRotation、localScale、forward、up、right
维持父子关系:parent、root(根对象)、childCount(子对象个数)
方法:
控制游戏对象的变换:
Translate(移动,在现有值的基础上加一个新值)、
Rotate(Vector3 vec)(当前物体沿着vec的方向和角度进行旋转:自转,在现有值的基础之上去旋转)
RotateAround(一点,一个轴,旋转的角度)(公转)
LookAt(将当前游戏对象的Z轴正方形指向某个位置)
维持父子关系:SetParent、GetChild、Find
Find:在子对象中通过名称查找一个Transform,特点:可以找到非激活的对象
3.Vector3(结构体)
成员方法:normalized 当前向量的标准化向量(归一化)
magnitude 向量的模
sqrMagnitude 模的平方 (比较两个向量的长度的时候使用)
静态方法:forward 世界的前方
up 世界的上方
right 世界的右方
Angle(Vector3,Vector3) 求两个向量的夹角 float类型
Distance(Vector3,Vector3) 求两个点的距离 float类型
Lerp 插值
Cross(temp0,temp1) 求两个向量的叉乘 法向量(左手法则:temp0穿过掌心,剩下的一个手指指向temp1,大拇指的方向为叉乘的方向)
Dot(Vector3,Vector3) 求两个向量的点乘
Project(Vector3,Vector3.dir) 求一个向量在一个方向上的投影向量
Normalize() 求单位向量
4.Quaternion(四元数)(结构体)
功能:表示一个旋转(解决万像锁问题)
LookRotation 将一个向量转成四元数(以Up轴为参照)
Lerp 插值
Euler(float x, float y, float z);(静态) 将欧拉角转成四元数
identity 空旋转
5.Mathf
Lerp:线性插值函数
Clamp(需要判断的数字,范围的下限,范围的上限):求限定值
Mathf.Deg2Rad;角度转弧度
Abs
Sin()、Cos()、Tan()、Asin()、Acos()、Atan()、Atan2()、PI
6.Time
deltaTime(从这一帧到下一帧的时间间隔)
fixedDeltaTime
time(从游戏开始到现在所经历的时间)
timeScale (时间缩放)游戏时间:现实时间
4.Collider(组件)
如果两个物体想发生碰撞,需要具备的条件:
--至少有一个物体需要有刚体组件
--两个物体都需要有碰撞盒子
--两物体有相对运动
1.属性:isTrigger、Center、Size
2.与鼠标的碰撞(7个回调函数)
OnMouseEnter 当鼠标进入碰撞体范围执行一次
OnMouseOver 鼠标在碰撞体范围内持续调用,每帧一次
OnMouseExit 当鼠标离开碰撞体范围执行一次
OnMouseDown 当鼠标在碰撞体范围内按下,执行一次
OnMouseDrag 当鼠标在碰撞体的范围内持续按下,鼠标保持移动持续执行,每帧一次
OnMouseUp 当鼠标在碰撞体范围内按下,抬起时执行一次
OnMouseUpAsButton 当鼠标在碰撞体范围内按下并抬起执行一次
3.碰撞体之间的碰撞(回调)
条件:两个必须都有碰撞体,其中至少一个有刚体,保持相对运动
OnCollisionEnter(Collision other) 开始碰撞时执行
OnCollisionStay(Collision other) 碰撞中保持相对运动时调用
OnCossionExit(Collision other) 碰撞结束时调用
4.触发
条件:两个物体都有碰撞组件,其中一个是触发器,至少有一个刚体
OnTriggerEnter(Collider other) 进入触发器时调用
OnTriggerStay(Collider other) 持续在触发器范围内调用
OnTruggerExit(Collider other) 离开触发器范围时调用
5.刚体(RigiBody)
1.属性:velocity 速度(向量)
2.方法:
AddForce(Vector3.forward*100):给物体添加一个位移的力
AddRelativeForce(Vector3.forward*100):给物体添加一个力,相对于自身坐标
AddTorque(Vector3.forward*100):给物体添加一个力矩,相对于世界坐标,给一个物体旋转的力
AddRelativeTorque(Vector3.forward*100):给物体添加一个力矩,相对于自身坐标
AddExplosionForce (力的大小,爆炸中心点,爆炸半径)特点:写在哪个刚体上,哪个刚体收到爆炸影响
3.组件属性
Mass、Drag、AngleDrag、useGrivaty、isKinematic、插值、碰撞检测、约束
6.物理射线
halfExtents:保留半径,从发射点开始,到保留半径范围内的物体不会被射线射到
射线是不会穿越物体的,只有具有碰撞体的物体才可以接收射线
Ray r = Camera.main.ScreenToRay(Input.mousePosition):从鼠标在屏幕的位置发射的一条射线,方向为摄像机到鼠标位置
RaycastHit hit;用来描述射线射到的物体
Physics.Raycast 检测一个
Physics.RaycastAll 检测多个
7.导航代理(NavMeshAgent)
Radius:半径 Height:高度 BaseOffset:偏移
speed:速度 AngularSpeed:角速度 Acceleration:加速度
StoppingDistance:停止距离(距离点的位置)
AutoBraking:自动减速到停止
Quality:躲避障碍物的质量
Priority:优先级(数大的优先级高)
AutoTraverseOffMeshLine:自动网格链接
AutoRepath:自动重新寻路(知道到达目的地)
AreaMask:代理人支持通过哪些导航区域
private NavMeshAgent nav;
private NavMeshPath path = new NavMeshPath();
//这个组件的普通方法,通过目标的位置,通过导航的方式判断能否到达目标位置如果能到达,返回一个NavMeshPath的对象path,里面存储着导航路径
//path有两个属性:1.status:返回的是NavMeshPath对象 2.corners:返回的是一个Vector3数组,所有拐点的坐标
nav.CalculatePath(Vector3 targetPosition,NavMeshPath path)
这里面设置的是路径的信息
AgentRadius:根据导航代理半径烘焙场景中的障碍物
AgentHeight:根据导航代理高度烘焙场景中的障碍物
MaxSlope:被烘焙的物体爬坡最高角度
StepHeight:能够被烘焙的台阶的高度
DropHeight:掉落高度
JumpDistance:跳跃距离
导航代理的动态障碍物组件(障碍物下面依然有路径)
Carve:重新动态烘焙(即时的烘焙,耗性能)
MoveThreshold:烘焙距离(障碍物移动到达烘焙距离后才会重新烘焙)
TimeToStationary:当障碍物静止多长时间后开始烘焙
CanveOnlyStationary:只有在静止的时候开始烘焙
NavagationStatic:静态导航
GenerateOffMeshLink:网格连接(可以用来做跳跃)
NavigationArea:当前障碍物属于哪个区域
Name:区域名字
Cost:花费
在导航的过程中,会自动寻找花费最小的路径