Unity入门&物理引擎

时间:2023-03-09 17:55:10
Unity入门&物理引擎

    一.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)

Unity入门&物理引擎

  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)

  

Unity入门&物理引擎

这里面设置的是路径的信息

  AgentRadius:根据导航代理半径烘焙场景中的障碍物

  AgentHeight:根据导航代理高度烘焙场景中的障碍物

  MaxSlope:被烘焙的物体爬坡最高角度

  StepHeight:能够被烘焙的台阶的高度

  DropHeight:掉落高度

  JumpDistance:跳跃距离

Unity入门&物理引擎

  导航代理的动态障碍物组件(障碍物下面依然有路径)

  Carve:重新动态烘焙(即时的烘焙,耗性能)

  MoveThreshold:烘焙距离(障碍物移动到达烘焙距离后才会重新烘焙)

  TimeToStationary:当障碍物静止多长时间后开始烘焙

  CanveOnlyStationary:只有在静止的时候开始烘焙

Unity入门&物理引擎

  NavagationStatic:静态导航

  GenerateOffMeshLink:网格连接(可以用来做跳跃)

  NavigationArea:当前障碍物属于哪个区域

  

Unity入门&物理引擎

  Name:区域名字

  Cost:花费

  在导航的过程中,会自动寻找花费最小的路径