EventTrigger事件触发器

事件触发器是什么

事件触发器是EventTrigger组件

它是一个集成了上节课中学习的所有事件接口的脚本

它可以让我们更方便的为控件添加事件监听

如何使用事件触发器

  1. 拖曳脚本进行关联
  2. 代码添加

代码添加

//申明一个希望监听的事件对象
EventTrigger.Entry entry = new EventTrigger.Entry();
//申明 事件的类型
entry.eventID = EventTriggerType.Drag;
//监听函数关联
entry.callback.AddListener((data) =>
{
    print("抬起");
});
//把申明好的 事件对象 加入到 EventTrigger当中
et.triggers.Add(entry);

事件监听接口

事件接口是用来解决什么问题的

目前所有的控件都只提供了常用的事件监听列表

如果想做一些类似长按,双击,拖拽等功能是无法制作的

或者想让Image和Text,RawImage三大基础控件能够响应玩家输入也是无法制作的

而事件接口就是用来处理类似问题

让所有控件都能够添加更多的事件监听来处理对应的逻辑

常用的事件接口

  • IPointerEnterHandler - OnPointerEnter - 当指针进入对象时调用 (鼠标进入)
  • IPointerExitHandler - OnPointerExit - 当指针退出对象时调用 (鼠标离开)
  • IPointerDownHandler - OnPointerDown - 在对象上按下指针时调用 (按下)
  • IPointerUpHandler - OnPointerUp - 松开指针时调用(在指针正在点击的游戏对象上调用)(抬起)
  • IPointerClickHandler - OnPointerClick - 在同一对象上按下再松开指针时调用 (点击)
  • IBeginDragHandler - OnBeginDrag - 即将开始拖动时在拖动对象上调用 (开始拖拽)
  • IDragHandler - OnDrag - 发生拖动时在拖动对象上调用 (拖拽中)
  • IEndDragHandler - OnEndDrag - 拖动完成时在拖动对象上调用 (结束拖拽)

不常用的事件接口

  • IInitializePotentialDragHandler - OnInitializePotentialDrag - 在找到拖动目标时调用,可用于初始化值
  • IDropHandler - OnDrop - 在拖动目标对象上调用
  • IScrollHandler - OnScroll - 当鼠标滚轮滚动时调用
  • IUpdateSelectedHandler - OnUpdateSelected - 每次勾选时在选定对象上调用
  • ISelectHandler - OnSelect - 当对象成为选定对象时调用
  • IDeselectHandler - OnDeselect - 取消选择选定对象时调用

导航相关

  • IMoveHandler - OnMove - 发生移动事件(上、下、左、右等)时调用
  • ISubmitHandler - OnSubmit - 按下 Submit 按钮时调用
  • ICancelHandler - OnCancel - 按下 Cancel 按钮时调用

使用事件接口

  1. 继承MonoBehavior的脚本继承对应的事件接口,引用命名空间
  2. 实现接口中的内容
  3. 将该脚本挂载到想要监听自定义事件的UI控件上

PointerEventData参数的关键内容

父类:BaseEventData

UGUI打图集

为什么要打图集

UGUI和NGUI使用上最大的不同是 NGUI使用前就要打图集

UGUI可以再之后再打图集

打图集的目的就是减少DrawCall 提高性能

DrawCall 就是CPU通知GPU进行一次渲染的命令

如果DC次数较多会导致游戏卡顿

我们可以通过打图集,将小图合并成大图,将本应n次的DC变成1次DC来提高性能

在Unity中打开自带的打图集功能

在工程设置面板中打开功能

Edit——>Project Setting——>Editor

Sprite Packer(精灵包装器,可以通过Unity自带图集工具生成图集)

  • Disabled:默认设置,不会打包图集
  • Enabled For Builds(Legacy Sprite Packer):Unity仅在构建时打包图集,在编辑模式下不会打包图集
  • Always Enabled(Legacy Sprite Packer):Unity在构建时打包图集,在编辑模式下运行前会打包图集
  • Legacy Sprite Packer传统打包模式 相对下面两种模式来说 多了一个设置图片之间的间隔距离
  • Padding Power:选择打包算法在计算打包的精灵之间以及精灵与生成的图集边缘之间的间隔距离 这里的数字 代表2的n次方
  • Enabled For Build:Unity进在构建时打包图集,在编辑器模式下不会打包
  • Always Enabled:Unity在构建时打包图集,在编辑模式下运行前会打包图集

打图集参数注意

一般会选择和关闭 Allow Rotation和Tight Packing参数

创建图集

Project窗口——>Create——>Sprite Atlas

将图片添加到Objects for Packing中

代码加载

//加载图集 注意:需要引用命名空间
SpriteAtlas sa = Resources.Load<SpriteAtlas>("MyAlas");
//从图集中加载指定名字的小图
sa.GetSprite("bk");

UGUI组件

Image组件

Image是图像组件

是UGUI中用于显示精灵图片的关键组件

是UGUI中用于显示精灵图片的关键组件

Image组件参数

  • Source Image

    图片来源

    必须是精灵类型

  • Color

    图像的颜色

  • Material

    图像的材质 一般不会修改 使用默认的

  • Raycast Target

    是否作为射线检测的目标 如果不勾选则不会响应射线检测

  • Maskable

    是否能被遮挡

  • Image Type

    图片类型

    • Simple 扑通模式 缩放整个图片
    • Sliced 9宫格拉伸
    • Tiled 平铺模式
    • Filled填充模式
      1. Fill Method 填充方式
      2. Fill Orgin 填充原点
      3. Fill Amount 填充量
      4. Clockwise 顺时针方向
  • Use Sprite Mesh

    使用精灵网络,勾选会生成图片网络

  • Preserve Aspect

    保持图片比例

  • SetNative Size

    设置为图片资源的原始大小

Image代码相关

//获取图片组件
Image img = this.GetComponent<Image>();
//设置图片
img.sprite = Resources.Load<Sprite>("ui_TY_fanhui_01");
//设置图片大小
(transform as RectTransform).sizeDelta = new Vector2(200, 200);
//设置图片射线检测
img.raycastTarget = false;
//设置图片颜色
img.color = Color.red;

Text文本组件

Text是文本组件

EventSystem和StandaloneInputModule

Event System组件用来干啥

Event System意思是事件系统

它是用于管理玩家的输入事件并分发给各UI控件

它是事件逻辑处理模块 所有的UI事件都通过EventSystem组件中轮询检测并做相应的执行它类似一个中转站,和许多模块一起共同协作

如果没有它,所有点击、拖曳等等行为都不会被响应

Event System组件参数

  • First Selected

    首先选择的游戏对象,可以设置游戏一开始的默认选择

  • Send Navigation Events

    是否允许导航事件(移动/按下/取消)

  • Drag Threshold

    拖拽操作的阈值(移动多少像素算拖拽)

Standalone Input Module组件用来干啥的

Standalone Input Module意思是

独立输入模块

它主要针对

处理鼠标/键盘/控制器/触屏(新版Unity)的输入输入的事件通过EventSystem进行分发

它依赖于EventSystem组件,他们两缺一不可

Standalone Input Module组件参数

  • Horizontal Axis

    水平轴按钮对应的热键名(该名字对应Input管理器)

  • Vertical Axis

    垂直轴按钮对应的热键名(该名字对应Input管理器)

  • Submit Button

    提交(确定)按钮对应的热建名(该名字对应Input管理器)

  • Cancel Button

    取消按钮对应的热建名(该名字对应Input管理器)

  • Input Actions Per Second

    每秒允许键盘/控制器输入的数量

  • Repeat Delay

    每秒输入操作重复率生效前的延迟时间

  • ForceModule Active

    是否强制模块处于激活状态

EventSystem和Standalone Input Module组件他们主要是用于输入事件监听管理和分发的 如果没有了他们两 那么UI中的所有输入事件将不会被响应

Graphic Raycaster组件

Graphic Raycaster用来干啥

Graphic Raycaster意思是图形射线投射器

用于检测UI输入事件的射线发射器

它主要负责通过射线检测玩家和UI元素的交互判断是否点击到了UI元素

Graphic Raycaster参数

  • Ignore Reversed Graphics

    是否忽略反转图形

  • Blocking Objects

    射线被哪些类型的碰撞器阻挡(在覆盖渲染模式下无效)

  • Blocking Mask

    射线被哪些层级的碰撞器阻挡(在覆盖渲染模式下无效)

Canvas的三种渲染模式和CanvasScaler组件

Canvas是什么?

Canvas的意思是画布 他是UGUI中所有UI元素能够被显示的根本 他主要负责渲染自己所有的子对象


Canvas的三种渲染模式

Screen Space - Overlay 屏幕空间,覆盖模式,UI始终在前

Screen Space - Camera 屏幕空间,摄像机模式,3D物体可以显示在UI前面

World Space 世界空间,3D模式


Screen Space - Overlay

覆盖模式,UI始终显示在场景内容前方 /usr/uploads/2024/10/4064492085.png

Pixel Prefect 是否开启无锯齿精确渲染(性能换效果)

SortOrder 排序层编号(用于控制多个Canvas时的渲染先后顺序)

TargetDisplay 目标设备(在哪个显示设备上显示)

Additonal Shader Channels 其他着色器通道们,决定着色器可以预读取那些数据


Screen Space - Camera

3D物体可以显示在UI前面

RenderCamera 用于渲染UI的摄像机(如果不设置将类似于覆盖模式)

Plane Distance UI平面在摄像机前方的距离,类似整体Z轴的感觉

Sorting Layer 所在排序层

Order in Layer 排序层的序号


World Space

3D模式,把UI对象像3D物体一样处理,一般用于VR或者AR

EventCamera 用于处理UI事件的摄像机 如果不设置不能注册事件,一般设置为主摄像机


CanvasScaler组件是什么?

CanvasScaler意思是画布缩放控制器 它是用于分辨率自适应的组件 CanvasScaler提供了三种用于分辨率自适应的模式 我们可以根据需求来选择

Blender入门

场景编辑 快捷键

  • 位移:{shift}+鼠标中键
  • 旋转:长按鼠标中键
  • 缩放:滚动鼠标中键

创建物体

方法一:

/usr/uploads/2024/07/image-20240703174749253.png

方法二:{shift}+{A}快捷键弹出菜单

对象的编辑

  • 位移

    快捷键{G}

  • 旋转

    快捷键{R}

  • 缩放

    快捷键{S}

在这个基础上再点击xyz,会沿着对应的轴向进行编辑

视图调整

  • 正视图{1}
  • 侧视图{3}
  • 透视图{5}
  • 顶视图{7}
  • 最大化显示:{.}
  • 独显:{/}

注意:小数字键盘的快捷键

安装node插件

编辑-偏好设置-插件-node-勾选即可

导航寻路系统(Navigation)

什么是导航寻路系统

  • Unity中的导航寻路系统是能够让我们在游戏世界当中
  • 让角色能够从一个起点准确的到达另一个终点
  • 并且能够自动避开两个点之间的障碍物选择最近最合理的路径进行前往
  • Unity中的导航寻路系统的本质
  • 就是在A星寻路算法的基础上进行了拓展和优化

我们要学习那些内容

  1. 导航网格(NavMesh)的生成——要想角色能够在场景中自动寻路产生行进路径,那么必须得先有场景地形数据,导航网格生成就是生成用于寻路的地形数据
  2. 导航网格寻路组件(NavMesh Agent)——寻路组件就是帮助我们根据地形数据计算路径让角色动起来的关键
  3. 导航网格连接组件(Off-Mesh Link)——当地形中间有断层,想让角色能从一个平面跳向另一个平面,网格连接组件时关键
  4. 导航网格动态障碍物组件(NavMesh Obstacle)——地形中可能存在的可以移动或动态销毁的障碍物需要挂载的组件

使用导航寻路系统并生成导航网络

  1. Window->AI->Navigation
  2. 选择Object页签 选择地形物体后 将Navigation Static 选中
    • 选中Navigation Static实际上是将物体设置为了Static静态
    • /usr/uploads/2024/07/image-20240702204322678.png
  3. 切换到bake页签 进行相关设置后 Bake生成

Object 场景对象设置页签

/usr/uploads/2024/07/image-20240702204443795.png

  • Sceme Filter 场景过滤器,配合Hierarchy窗口使用 All:显示场景上所有对象 MeshRenderers:显示挂载的网格渲染器的对象 Terrains:显示挂载了地形脚本的对象
  • Navigation Static 导航静态物体开关
  • Generate OffMeshLinks 生成网格连接点开关
  • Navigation Area 导航区域选择,配合Areas页签使用

Bake导航数据烘焙页签

/usr/uploads/2024/07/image-20240702204543184.png

角色控制器(Character Controller)

角色控制器是什么?

角色控制器是让角色可以受制于碰撞,但是不会被刚体所牵制

如果我们对角色使用刚体判断碰撞,可能会出现一些奇怪的表现

比如:

  1. 在斜坡上往下滑动
  2. 不加约束的情况碰撞可能让自己被撞飞等等

而角色控制器会让角色表现的更加稳定

Unity提供了角色控制器脚本专门用于控制角色

注意

  • 添加角色控制器后,不用再添加刚体
  • 能检测碰撞函数
  • 能检测触发器函数
  • 能被射线检测

角色控制器的使用

  1. 为对象添加角色控制器组件:Character Controller
  2. 使用代码控制

角色控制器参数

/usr/uploads/2024/07/image-20240702164419422.png

  • Slope Limit

    坡度度数限制,大于该值的斜坡上不去

  • Step Offset

    台阶偏移值,单位为米,低于这个值的台阶才能上去,该值不能大于角色控制器的高度

  • Skin Width

    皮肤的宽度,两个碰撞器可以穿透彼此最大的皮肤宽度

    较大的值可以减少抖动,较小的值可能会导致角色卡住

    建议设置为半径的10%

  • MinMoveDistance

    最小的移动距离

    一般设置为0,可以用来减少抖动

代码相关

获得角色控制器

var cc = GetComponent<CharacterController>();

判断是否接触到地面

if ( cc.isGrounded )
{
    print("接触地面了");
}

移动

状态机行为脚本

状态机行为脚本是什么?

  • 状态机行为脚本时一类特殊的脚本,继承指定的基类
  • 当进入、退出、保持在某一个特定状态时我们可以进行一些逻辑处理
  • 利用这个脚本我们可以做一些特殊功能
  • 比如进入或退出某一状态时播放声音,仅在某些状态下检测一些逻辑,比如是否接触地面等等

如何使用状态机脚本

  1. 新建一个脚本继承StateMachineBehaviour基类
  2. 实现其中的特定方法进行状态行为监听
  • OnStateEnter 进入状态时,第一个Update中调用
  • OnStateExit 退出状态时,最后一个Update中调用
  • OnStateIK OnAnimatorIK后调用
  • OnStateMove OnAnimatorMove后调用
  • OnStateUpdate 除第一帧和最后一帧,每个Update上调用
  • OnStateMachineEnter 子状态机进入时调用,第一个Update中调用
  • OnStateMachineExit 子状态机退出时调用,最后一个Update中调用
public override void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
    if( stateInfo.IsName(stateName) )
        Debug.Log("进入HumanoidIdle状态");
}

public override void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
    if (stateInfo.IsName("HumanoidIdle"))
        Debug.Log("退出HumanoidIdle状态");
}

public override void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
    base.OnStateIK(animator, stateInfo, layerIndex);
}

public override void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
    base.OnStateMove(animator, stateInfo, layerIndex);
}

public override void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
    base.OnStateUpdate(animator, stateInfo, layerIndex);
    if (stateInfo.IsName("HumanoidIdle"))
        Debug.Log("处于HumanoidIdle状态");
}

public override void OnStateMachineEnter(Animator animator, int stateMachinePathHash)
{
    base.OnStateMachineEnter(animator, stateMachinePathHash);
}

public override void OnStateMachineExit(Animator animator, int stateMachinePathHash)
{
    base.OnStateMachineExit(animator, stateMachinePathHash);
}

状态机复用

状态机复用是什么?

​ 游戏开发时经常遇到这样的情况

​ 有n个玩家和n个怪物,他们的动画状态机行为都是一致的,只是对应的动作不同而已

​ 这时如果我们为他们每一个对象都创建一个状态机进行状态设置和过渡设置无疑是浪费时间的

​ 所以状态机复用就是解决这一问题的方案

​ 主要用于为不同对象使用共同的状态机行为

​ 减少工作量 提升开发效率

如何复用状态机

  1. 在Project窗口右键Create->Animator Override Controller
  2. 为Animator Override Controller文件在Inspector窗口关联基础的Animator Controller文件
  3. 关联需要的动画

动画目标匹配

什么是动画目标匹配

动画目标匹配主要指的是

当游戏中角色要以某种动作移动,该动作播放完毕后,人物的手或者脚必须落在某一个地方

比如:角色需要跳过踏脚石或者跳跃并抓住房梁

那么这时我们就需要动作目标匹配来达到想要的效果

如何实现动画目标匹配

Unity中的Animator提供了对应的函数来完成该功能

  1. 找到动作关键点位置信息(比如起跳点,落地点,简单理解就是真正可能产生位移的动画表现部分)
  2. 将关键信息传入MatchTargetAPI中

注意

  1. 必须保证动画已经切换到了目标动画上
  2. 必须保证调用时动画并不是处于过度阶段而真正在播放目标动画
  3. 需要开启Apply Root Motion
//在动画中添加事件调用此方法
private void MatchTarget()
{
    //参数一:目标位置
    //参数二:目标角度
    //参数三:匹配的骨骼位置
    //参数四:位置角度权重
    //参数五:开始位移动作的百分比
    //参数六:结束位移动作的百分比
    animator.MatchTarget(targetPos.position, targetPos.rotation, AvatarTarget.RightFoot, new MatchTargetWeightMask(Vector3.one, 1), 0.4f, 0.64f);
}

动画IK控制

什么是IK?

  • 在骨骼动画中,构建骨骼的方法被称为正向动力学
  • 它的表现形式是,子骨骼(关节)的位置根据父骨骼(关节)的旋转而改变
  • 当我们抬起手臂时,是肩部关节带动的整个手臂的运动,用父子骨骼理解的话就是父带动了子
  • 而IK全称是Inverse Kinematics,翻译过来的意思就是反向动力学的意思
  • 它的表现形式是,子骨骼(关节)末端的位置改变会带动自己以及自己的父骨骼(关节)旋转

如何进行IK控制

  1. 在状态机的层级设置中 开启 IK 通道

  2. 继承MonoBehavior的类中

    Unity定义了一个IK回调函数:OnAnimatorIK

    我们可以在该函数中调用Unity提供的IK相关API来控制IK

Animator中的IK相关API

OnAnimatorIK回调函数

//参数 状态机层级
private void OnAnimatorIK(int layerIndex)
{
	//设置ik的代码
}

设置头部IK权重

//重载
//weight:LookAt全局权重0~1
//bodyWeight:LookAt时身体的权重0~1
//headWeight:LookAt时头部的权重0~1
//eyesWeight:LookAt时眼镜的权重0~1
//clampWeight:0表示角色运动时不受限制,1表示角色完全固定无法执行LookAt,0.5表示只能够移动范围的一半
animator.SetLookAtWeight(1f,1f,1f);

设置头部IK看向位置

animator.SetLookAtPosition(pos.position);

设置IK位置权重

动画分层和遮罩

动画分层的作用

  • 两套不同层动作的切换
  • 结合动画遮罩让两个动画叠加在一起播放
  • 提升动画多样性,节约资源
  • 利用动画分层我们可以做到
    1. 上下半身播放两个动画进行组合,比如上半身扔炸弹,下半身待机移动蹲下
    2. 快速制作正常状态和受伤状态的动作切换

如何使用动画分层

  1. 新建一个动画层
  2. 设置动画层参数
  3. 在该层中设置状态机(注意:结合遮罩使用时默认状态一般为Null状态)
  4. 根据需求创建动画遮罩

代码设置动画层

animator = this.GetComponent<Animator>();
animator.SetLayerWeight(animator.GetLayerIndex("MyLayer2"), 1);

动画层参数设置

/usr/uploads/2024/07/image-20240701132323264.png

  • Weight

    权重

    当动画同时播放时,如果选择的是叠加方式,会根据权重决定叠加的比例

  • Mask

    动画遮罩

    该层动画全部都会受到该遮罩的影响

  • Blending

    混合方式

    • Override:覆盖方式,播放该层动画时忽略其他层的信息
    • Additive:叠加方式,回合其他层动画叠加播放
  • Sync

    是否同步其他层

    主要用于直接从另一个层复制状态过来,在该层中进行修改

    适用于比如正常状态下有待机走路跑步等等动作,但是受伤状态下动作会改变,可以利用同步层方便我们进行编辑

    选择后会多一个SourceLayer表示你要复制哪一层的状态

  • Timing

    当选中Sync同步其他层时,该参数激活选中,会采用折中方案调整同步层上的动画时长(基于权重计算)

    不选中动画时长会使用原始层作为模板

  • IK Pass

    反向动力学

动画混合

什么是动画混合

游戏动画中常见的功能就是在两个或者多个相似运动之间进行混合

比如

  1. 根据角色的速度来混合行走和奔跑动画
  2. 根据角色的转向来混合向左或向右倾斜的动作

你可以理解是高级版的动画过渡

创建动画混合状态

在Animator Controller窗口 右键->Create State->From New Blend Tree

动画混合的种类

  • 1D混合

    用一个简单参数控制动画的混合,之所以叫1D是因为一个参数可以看作是1维线性的

  • 2D混合

    可以简单理解为是用两个参数控制动画的混合,之所以叫2D是因为有两个参数 可以看作是2维平面xy轴的感觉

2D混合的种类

  • 2D Simple Directional

    2D简单定向模式 运动表示不同方向时使用 比如前后左右走

  • 2D Freeform Directional

    2D自由形式定向模式 同上 运动表示不同方向时使用 但是可以在同一方向上有多个运动 比如向前跑和走

  • 2D Freeform Cartesian

    2D自由形式笛卡尔坐标模式 运动不表示不同方向时使用 比如向前走不拐弯 向前跑不拐弯 向前走右转 向前跑右转

  • Direct

    直接模式 自由控制每个节点权重,一般做表情动作等

1D混合

1D混合就是通过一个参数来混合子运动

/usr/uploads/2024/07/image-20240701151043553.png

  • Parameter 参数,用于控制混合的参数,在参数列表中的参数

  • 蓝色图像 可以在这里控制n个动画的阈值

  • Motion 关联的动画列表,可以用鼠标改变顺序

  • Threshold 对应动作的临界阈值 当等于这个值时动作权重最大(完全播放该动作) 这个值可以完全自由控制,数值范围不定

  • /usr/uploads/2024/07/image-20240701151807660.png控制动作的播放速度

3D动画的使用

使用导入的3D动画

  1. 将模型拖入场景中
  2. 为模型对象添加Animator脚本
  3. 为其创建Animator Controller动画控制器(状态机)
  4. 将想要使用的相关动作 拖入Animator Controller动画控制器(状态机)窗口
  5. 在Animator Controller动画控制器(状态机)窗口编辑动画关系
  6. 代码控制状态切换

状态设置相关参数

/usr/uploads/2024/06/image-20240629113504191.png

  • Motion

    分配给此状态的动画剪辑

  • Speed

    动画的默认速度

  • Multiplier

    控制速度的乘数,如果要使用需要勾选的Parameter选中配合的参数float类型

  • Motion Time

    运动的时间,如果要使用需要勾选的Parameter选中配合的参数float类型

  • Mirror

    是否为状态生成镜像,仅适用于人形动画,如果要配合参数使用选中旁边的Parameter关联参数,参数是bool类型

  • Cycle Offset

    循环偏移时间,如果要配合参数使用选中旁边的Parameter关联参数,参数是float类型

  • Foot IK

    是否遵循Foot IK,适用于人形人形动画

  • Write Defaults

    AnimatorStates 是否为其运动执行未动画化的属性写回默认值。

  • Solo

    仅播放该过渡

  • Mute

    禁用过渡

    Solo和Mute如果一起选择,Mute优先执行

  • Add Behaviour

    添加状态机行为脚本,之后会专门讲解

连线参数

动作和动作之间连线

/usr/uploads/2024/06/image-20240629113850034.png

  • /usr/uploads/2024/06/image-20240629113907767.png

Rigidbody2D使用与优化

刚体的移动

当gameobject被加上rigidbody2d组件时,如果想移动它,不要这样写:

void Update(){
        this.transform.Translate (Vector3.left * speed * Time.deltaTime);
}

这种写法,主要针对无rigidbody2d的gameobject对象,否则,性能很差。 正确的写法:

方法一:

void FixedUpdate()
{
    rigidbody2D.MovePosition (rigidbody2D.position + Vector2.left * speed * Time.fixedDeltaTime);
}

方法二:

void Start () 
{
    rigidbody2D.velocity = Vector2.left * speed;
}

Body Type属性

rigidbody2d最为重要的一个属性,不同的选项,不同的物理效果:

Dynamic(动态的)

  1. 具有完全的物理特性
  2. 会与所有类型的Rigidbody2D进行碰撞;
  3. 是最常用的Rigidbody2D类型、也是默认的类型;
  4. 是最耗费性能的类型;

Kinematic(运动学)

  1. 仅在用户控制下运动,不会受到重力和AddForce等力相关函数的影响;
  2. 只与Dynamic的Rigidbody2D发生碰撞(不勾选Use Full Kinematic Contacts);
  3. 不能通过力或碰撞改变速度,但是可以设置其速度和位置、旋转;
  4. 比Dynamic性能高;

Static (静态的)

  1. 具有无限质量、不可移动的物体;
  2. velocity、AddForce、gravity、MovePosition、MoveRotation都不可用;
  3. 只与Dynamic的Rigidbody2D发生碰撞;
  4. 性能最高;

Simulated 物理模拟

设置为true(勾选)时开启模拟;设置为false(不勾选)时关闭模拟。

模型导入相关参数

Unity中使用的模型

Unity支持很多模型格式(fbx、dae、3ds、dxf、obj)等

99%的模型都不是在Unity中制作的,是美术人员在建模软件中制作

虽然Unity支持很多模型格式 但是官方建议在模型软件中导出为FBX格式后再使用

FBX模型格式的优势

  1. 减少不必要的数据,提升导入效率
  2. 不需要在每台计算机上安装建模软件的授权副本
  3. 对Unity版本无要求,使用原始3D模型格式可能会因为版本不同导致错误或意外

导入模型的基本流程

  1. 美术同学用3D建模软件制作好模型导出FBX格式模型资源
  2. 程序将这些模型资源导入到Unity的资源文件夹中
  3. 在Unity内部对这些模型进行基础设置-模型、骨骼、动作、材质等

模型页签(Model)

该页签用于设置

模型比例设置

是否导入模型中的摄像机和光源

网络压缩方式等等相关设置

修改模型中存储的各种元素和属性

最终会影响Unity中使用模型时的一些表现


模型页签参数

Scene场景相关设置

/usr/uploads/2024/06/image-20240628163358856.png

Scale Factor 当模型中的比例 不符合项目中预期的比例时 可以修改此值来改变模型的全局比例 Unity的物理系统希望游戏世界中的一米在导入模型文件中为1个单位

Convert Units 启用可将模型文件中定义的模型比例转换为Unity的比例 不同格式的比例如下: .fbx .max .jas = 0.01 .3ds .ma .lxo .dxf .blend .dae = 1

Import Blendshapes 是否允许Unity随网络一起导入混合形状 当导入包含混合形状时,请使用Skinned Mesh Renderer组件 注意:

  1. 导入混合形状发现需要在FBX文件中具有平滑组
  2. 如果想要导入具有法线的混合形状 把下方Blend Shape Normals属性设置为Import,将使用FBX文件的法线 或者把下方的Blend Shape Normals属性设置为Calculate,Unity使用相同的逻辑来计算网络和混合形状上的法线

Import Visibility 是否导入可见性 开启后可以从FBX文件中读取可见性属性。 比如模型动作里 有些动作是要隐藏模型形象的,开启后才会生效 一些3D建模软件对可见性属性不支持或者有限制 比如Maya和Blender就对可见性有限制 所以一般这个选项要根据使用的建模软件决定 一般不勾选

2D骨骼Spine

Spine是什么?

  • Spine是一个收费的跨平台2D骨骼动画制作工具
  • 他支持Unity、UE、Cocos2D、Cocos2D-x等等游戏引擎
  • 相对Unity2018才退出的2D Animation Spine是目前商业游戏中较为常用的骨骼动画制作方案

导入 Spine

  • 在Spine制作骨骼动画 并导出
  • Spine导出的资源有三个文件
    • .json存储了骨骼信息
    • .png使用的图片图集
    • .atlas 图片在图集中的位置信息
  • Unity中下载并导入Spine包
    • 下载地址:https://zh.esotericsoftware.com/spine-unity-download/
  • 导入Spine导出的三个资源文件
  • 当我们把这三个资源文件导入到已经引入了Spine运行库的Unity工程后会自动生成
    • _Atlas 材质和.atlas.txt文件的引用配置文件
    • _Material 材质文件
    • _SkeletonData json和_Atlas资源的引用配置文件

骨骼动画代码控制

SkeletonData Asset参数

/usr/uploads/2024/06/image-20240627162126124.png

Skeleton Data骨骼数据

  • SkeletonData JSON 骨骼数据文件
  • Scale 缩放大小
  • Skeleton Data Modifiers 骨骼数据修改器
  • Blend Mode Materizls 混合模式材质
  • Apply Additive Materals 叠加材质
  • Multiply Materials 相乘材质
  • Screen Materials 屏幕材质

Atlas Assets 图集资源

Mix Setting 混合设置

  • Animation State Data 动画状态数据
  • Default Mix Duration 默认混合持续时间
  • Add Custom Mix 添加自定义混合(可以指定某两个动画之间的持续时间)

Preview 预览