unity学习笔记(二)

news/2024/10/2 10:39:26

2D渲染

Camera相机设置

Projection(投影方式):修改为Orthographic(正交)
Size:改变相机的视野大小

Sprite

“精灵图”一词首次作为图形术语出现,是在德州仪器的9918(A)视频显示处理器上。使用“精灵图”作为术语,是因为精灵图并不是帧缓冲中位图数据的一部分,而是“悬浮”于帧缓冲中数据之上,不影响其中数据,就像精灵飘在上面一样。

在Unity中:png / jpg等常规图片,一般不在Unity中直接使用,而是转为Sprite

SpriteRender

顾名思义,用来渲染Sprite的渲染器

属性 功能
Sprite 定义该组件应渲染的精灵纹理。单击右侧的小圆点可打开对象选择器窗口,然后从可用精灵资源列表中进行选择。
Color 定义精灵的顶点颜色,用于对精灵的图像进行着色或重新着色。使用拾色器设置渲染的精灵纹理的顶点颜色。请参阅此表下方的颜色部分以查看示例。
Flip 沿选定的轴翻转精灵纹理。这不会翻转游戏对象的变换位置。
Sorting Layer 设置精灵的排序图层(Sorting Layer),此图层用于控制渲染期间的精灵优先级。从下拉框中选择现有的排序图层,或创建新的排序图层。
Order In Layer 设置精灵在其排序图层中的渲染优先级。首先渲染编号较低的精灵,编号较高的精灵叠加在前者之上。
Sprite Sort Point 在计算精灵和摄像机之间的距离时,在精灵中心(Center)或其轴心点(Pivot Point)之间进行选择。

Unity输入系统

这里调用的Input类是由命名空间UnityEngine提供的,如果有using Input = UnityEngine.Windows.Input;的话将会导致这里的Input不能直接调用

监听键盘输入

键盘输入有三种状态:

  • 按下的瞬间
  • 持续按下中
  • 弹起的瞬间

下方三个函数返回都是bool类型,参数都是KeyCode枚举类型

Input.GetKeyDown(KeyCode.A);
Input.GetKey(KeyCode.A);
Input.GetKeyUp(KeyCode.A);        

监听键盘输入

和键盘差不多,不过0是鼠标左键、1是鼠标右键、2是鼠标中键

Input.GetMouseButtonDown(0);
Input.GetMouseButton(0);
Input.GetMouseButtonUp(0);

Input Manager

Unity提供了一种常见且方便的使用方式:

大多数游戏中使用键盘A和D来控制玩家在水平方向上的移动,这里提供一个函数:

按下A,函数的返回值会偏向-1;按下D,函数的返回值会偏向1;如果不按A或D则偏向0(使用“偏向”是因为会缓动效果,例如按下A后,数值会慢慢减到-1,按下D后,数值会慢慢加到1,不按会慢慢回到0,可以模拟出启动、惯性的效果)

Input.GetAxis("Horizontal");
Input.GetAxisRaw("Horizontal");//不进行缓动,只有三种结果:-1,0,1

Horizontal是水平方向轴(X轴),Vertical是纵向方向轴(Y轴)

他们都在Unity界面中的Edit -> Project Settings -> Input Manager中配置


Unity2D动画概览

Unity的2D动画和3D动画在操作层面上用的是同一个组件,操作方式也类似,但是相关知识点有所不同,所以不能武断地认为2D动画等于3D动画

Animator:动画组件(组件)

用来持有AnimatorController的组件,注意可以多个Aniamtor持有一份AnimatorController

AnimatorController:动画控制器(文件)

动画控制器相当于是一个配置文件,配置的是一个角色有哪些动画,动画和动画之间如何跳转

状态:当前角色处于的状态,状态会持有具体的AnimationClip

条件:动画之间的切换基于什么条件

参数:条件基于参数来判断是否满足,满足则切换

  • intfloatbool和代码中的类似
  • Trigger:触发一次,bool相当于是一种状态,但是Trigger是一个一次性使用的条件

AnimationClip:动画片段(文件)

动画片段,就是动画文件,记录了每一帧的信息。Unity内可以制作动画,但是从其他建模类软件导入的情况也比较多(尤其是3D动画)

2D动画也分为帧动画和骨骼动画

  1. 帧动画就是通过切换图片形成动画

  2. 而骨骼是通过旋转、缩放、移动关节点进行变化的动画

动画切换

Unity动画组件本质上是引用了一个“动画状态机”(AnimationController)的配置文件

  • 状态:当前角色处于的状态,状态会持有具体的AnimationClip
  • 条件:参数在“发生何等变化”时会进行状态切换
    Has Exit Time:即使条件满足也需要等待当前状态的播放完毕才能进行切换(后摇)
  • 参数:提供给脚本去访问、修改的“值”,这些值变化则状态变化,则动画发生改变

无视参数、条件的动画播放

CrossFadenInFixedTime:此函数

//参数1:状态名称
//参数2:过度时间(秒)
animator.CrossFadenInFixedTime("Move", 0.25f);

角色移动动画

想要角色移动,就要搞定三个基本点:

  1. 角色待机与移动动画的切换
  2. 角色向不同方向移动时的贴图方向
  3. 角色实现物理位移

要解决第一个问题,就要在Animator中选中两个动画直接的切换连线,添加判断变量(Parameters)和合适的条件(Conditions)(因为是角色移动所以这里设置的是bool变量和真假判断)

然后在脚本中获取Animator组件并为变量Move判断赋值

第二个问题直接在脚本中调用localScale,并根据不同方向将X轴的数值置正数或负数即可实现

第三个问题前面有提

脚本如下:

public class TestAnimator : MonoBehaviour
{// Start is called before the first frame updatepublic float moveSpace = 5;public Animator animator;void Start(){}// Update is called once per framevoid Update(){float inputX = UnityEngine.Input.GetAxis("Horizontal");float inputY = UnityEngine.Input.GetAxis("Vertical");//动画切换bool isMoving = (inputX!= 0 || inputY!= 0);animator.SetBool("Move", isMoving);//移动方向if (inputX > 0) transform.localScale = new Vector3(10, 10, 1);else if (inputX < 0) transform.localScale = new Vector3(-10, 10, 1);//角色移动Vector3 moveDirection = new Vector3(inputX, inputY, 0);transform.Translate(moveDirection * moveSpace * Time.deltaTime);}
}

动画事件

可以在动画中的某一帧插入一个事件来执行想要的效果(如落地时播放音效)

动画事件可以调用脚本中的函数或方法来执行效果


2D物理系统

碰撞体(Collider

决定物理单位作为物体碰撞时的形状,可以是矩形、圆形亦或是自定义的多边形

参数解释

  • Edit Collider:编辑碰撞体大小
  • Material:物理材质,决定物体的碰撞特性
  • Is Trigger:是否为触发器
  • Auto Tiling:碰撞体大小自动贴合物理单位边框

刚体(Rigidbody 2D

物理单位的物理特性,也就是定义物理单位怎样受到物理的控制,如重力等

参数解释

  • Body Type
    Dynamic动力学体。默认选项,受物理引擎影响,会主动响应重力、碰撞和其他外力。用于需要物理交互和自然运动的物体(玩家、敌人或可以被推动的物体)
    Kinematic运动体。运动体不会主动受到外力的影响,但可以通过代码控制其位置和旋转。这意味着你可以手动设置其速度和方向,但它不会响应重力或碰撞力。运动体可以推动其他动力学刚体,但自身不会因碰撞而移动。
    Static静态体。当设置为静态体时,物体不会受到物理力的影响,它不会移动或旋转,除非通过代码直接改变其位置或旋转。这通常用于不需要物理交互的物体,例如背景元素或固定结构。

    如果你想要一个物体能够自然地掉落并在碰撞时反弹,你会选择Dynamic。如果你想要一个物体保持固定位置,但仍然能够通过代码进行移动,你会选择Kinematic。如果你完全不希望物体参与物理计算,你会选择Static

  • Material:物理材质,决定物体的碰撞特性
    Friction:摩擦力
    Bounciness:弹力

  • Simulated:模拟效果(编辑时展示模拟效果)

  • Mass:质量,影响着物体的惯性和加速度

  • Gravity Scale:重力,影响重力加速度(0 = 无重力,1 = 标准重力,2 = 两倍标准重力)

  • Linear Drag:线性阻力,影响位置移动时的阻力参数

  • Angular Drag:角阻力,影响旋转运动时的阻力参数

  • Collider Detection碰撞检测,用于确定物体是否互相碰撞的一个关键机制
    Discrete:离散,计算成本较低。在离散碰撞检测中,物理引擎会在固定的时间步长(通常是FixedUpdate周期)检查物体的位置并确定他们是否发生碰撞。如果物体移动的速度过快将会穿越应该与之碰撞的物体,俗称“隧穿”。
    Continuous:连续,计算成本较高。连续碰撞检测适用于处理快速移动的物体,以免出现“隧穿”问题。在连续碰撞检测中,物理引擎会考虑物体在时间步长内的运动,并尝试找到第一个接触点。这种检测方式比离散碰撞检测消耗更多的CPU资源,因此通常只对那些需要它的物体使用。

  • constraints:定义对 2D 刚体运动的任何限制。
    Freeze Position:选择性地阻止2D刚体沿世界X和Y轴移动。这不会阻止刚体的旋转,但会锁定其在特定轴上的平移运动 。
    Freeze Rotation:选择性地阻止2D刚体围绕Z轴旋转。刚体仍然可以自由移动,但旋转将被限制

事件

碰撞事件

当两个物理单位相撞时会调用的逻辑

前提条件:双方都有碰撞体,其中一个有刚体

//发生碰撞
private void OnCollisionEnter2D(Collision2D collision)
{Debug.Log("发生碰撞");if(cllision.gameObject.name == "S1"){Destory(gameObject);}
}
//持续碰撞
private void OnCollisionStay(Collision collision)
{Debug.Log("持续碰撞");
}
//结束碰撞
private void OnCollisionExit2D(Collision2D collision)
{Debug.Log("结束碰撞");
}

触发事件

当两个物理单位其中一个碰撞体设置为触发器时调用的逻辑

前提条件:双方都有碰撞体,一方为触发器,另一方有刚体

//发生触发private void OnTriggerEnter2D(Collider2D collision){Debug.Log("发生触发");}//持续触发private void OnTriggerStay2DStay(Collision collision){Debug.Log("持续触发");}//结束触发private void OnTriggerExit2D(Collision2D collision){Debug.Log("结束触发");}

碰撞事件与触发事件的区别

  1. 碰撞事件和触发事件不能同时发生
  2. 碰撞事件:会导致物理力的计算和应用,例如动量转移和碰撞响应。触发事件:不会导致物理力的计算,它们仅作为检测机制,用于检测物体是否进入或离开特定区域。
  3. 碰撞事件:因为涉及到物理计算,可能会对性能有更高的要求触发事件通常用于优化,因为它们避免了物理力的计算,特别是在需要频繁检测物体是否穿过区域的场景中。
  4. 碰撞事件:适用于需要物理交互和响应的场景,如球撞击地面或车辆碰撞。触发事件:适用于不需要物理力但需要检测物体进入特定区域的场景,如触发门的开关、检测玩家进入特定区域等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/55490.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

c#学习笔记(一)

基础语法 文档注释&代码块/// <summary>/// 待机/// </summary>#region 物体移动sq.transform.Translate(new Vector3(5,0,0));#endregion字符串格式化输出 使用 $ 可进行格式化输出 C# string 字符串的前面可以加 @(称作"逐字字符串")将转义字符(…

Linux 中实现按照每一列的类别计算 指定列值的平均数

001、[root@PC1 test]# ls a.txt [root@PC1 test]# cat a.txt ## 测试数据如下 a 8 a 3 b 2 e 2 d 10 b 3 b 7 e 4 [root@PC1 test]# awk {ay[$1] += $2; ay2[$1]++} END {for (i in ay) …

广受欢迎文档管理系统有哪些?这10款不容错过

比较好用的 10 款文档管理系统推荐:PingCode、Worktile、语雀、联想Filez企业网盘、360亿方云、DocuPhase 、M-Files 、LogicalDOC、Revver、Box。在现代企业环境中,管理大量文档和数据往往让人头疼。不仅需要维护信息的更新和可访问性,还要确保安全和遵守法规。这使得选择一…

Web刷题之polarctf靶场(1)

PolarCTF 1.XFF打开靶场发现需要ip为1.1.1.1的用户才行, 打开BurpSuite进行抓包并对数据包进行修改,根据题目XFF提示flag{847ac5dd4057b1ece411cc42a8dca4b7}对此题所考察的知识进行一个扩展(对于构造本地用户语句) X-Forwarded-For:127.0.0.1X-Forwarded:127.0.0.1Forwarded-F…

丽水人社公需科目刷课脚本-JavaScript编写

脚本 学习网站:rlzy.lshrss.cn/Service/Index 脚本地址:丽水市专业技术人员继续教育公需科目-刷课脚本 教程 1.插件安装(以Microsoft Edge浏览器为例)打开最中间那个蓝色绿色的浏览器,谷歌之类的浏览器也可以点击屏幕右上角三个点,图示位置,然后点击扩展点击获取扩展搜索…

【工具分享】红队重点资产指纹识别 -- P1finger -0.02(最新版本)

工具介绍: P1finger 红队行动下的重点资产指纹识别工具。P1finger 是一个重点资产指纹识别的工具,旨在通过HTTP请求特征来识别目标系统。其主要特点包括: 语言和实现: 语言:使用Go语言(Golang)实现。 目的:强调跨平台能力和易于集成。 指纹库和检测策略: 指纹库:通过…

四川省专业技术人员继续教育网刷课脚本-JavaScript编写

脚本 学习网站:四川省专业技术人员继续教育网 edu.scjxjypx.com/ 脚本地址: chinahrt.com-刷课脚本 教程 1.插件安装(以Microsoft Edge浏览器为例)打开最中间那个蓝色绿色的浏览器,谷歌之类的浏览器也可以点击屏幕右上角三个点,图示位置,然后点击扩展点击获取扩展搜索T…

Kafka事务实现原理

1 Kafka的事务 V.S RocketMQ RocketMQ事务主要解决问题:确保执行本地事务和发消息这俩操作都成功/失败。RocketMQ还有事务反查机制兜底,更提高事务执行的成功率和数据一致性。 而Kafka事务,是为确保在一个事务中发送的多条消息,要么都成功,要么都失败。 这里的多条消息不一…