IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 【笔记】要点总结:Unity 2D教程——Ruby’s Adventure -> 正文阅读

[游戏开发]【笔记】要点总结:Unity 2D教程——Ruby’s Adventure

Ruby's Adventure: 2D Beginner - Unity Learnhttps://learn.unity.com/project/ruby-s-adventure-2d-chu-xue-zhe?uv=2019.4

目录

移动时发生碰撞,为什么会抖动?

如何解决抖动?读取输入和移动的正确示范

只有Collider2D,没有Rigidbody2D的箱子

遮挡(排序问题)、轴点(Pivot)、碰撞体形状

使用复合碰撞体(制作地形)

对象暂停移动时,检测不到碰撞

混合树(Blend Tree)

比较浮点数?

在Start函数中获取组件的问题


移动时发生碰撞,为什么会抖动?

因为物理系统使用的是场景的简化副本,这个副本中仅包含碰撞体。这个物理场景可以使物理系统的计算更简化。

物理系统是如何工作的?

  • 每当带有刚体游戏对象场景中移动时,在物理场景中移动自己的游戏对象副本

  • 施加作用力并计算碰撞。

  • 场景中的游戏对象移动到物理场景中计算出的新位置。

在此示例中,这会导致以下事件:

  • 你在帧更新(Update)过程中移动角色到位置A

  • 物理系统将自己的游戏对象副本移到位置A

  • 物理系统发现:角色碰撞体现在位于另一个碰撞体(此处为箱子)内,然后将角色碰撞体移回以便不再位于箱子内(重新获得位置B)。

  • 物理系统将 角色游戏对象?同步到位置B

你不断移动 Ruby 到箱子内,而物理系统则将她移回。你要求代码执行的操作与物理系统执行的操作之间的这种冲突就会导致发生抖动。

(关于刚体的更多内容:)2D刚体与碰撞icon-default.png?t=M0H8https://blog.csdn.net/yjy99yjy999/article/details/112839298

如何解决抖动?读取输入和移动的正确示范

在类中添加两个浮点变量,以便在 Update 函数内存储当前的水平和垂直输入数据。

public class RubyController : MonoBehaviour
{
    Rigidbody2D rigidbody2d;
    float horizontal; 
    float vertical;
    
    void Start()
    {
        rigidbody2d = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        horizontal = Input.GetAxis("Horizontal");
        vertical = Input.GetAxis("Vertical");
    }

    void FixedUpdate()
    {
        Vector2 position = rigidbody2d.position;
        position.x = position.x + 3.0f * horizontal * Time.deltaTime;
        position.y = position.y + 3.0f * vertical * Time.deltaTime;

        rigidbody2d.MovePosition(position);
    }
}
  • ?Update 函数——每次游戏计算新图像时都会调用 Update,问题是调用速度不确定
  • ?FixedUpdate 函数——定期进行更新(例如,每隔 16ms)。
    • 但是,不应该在 Fixedupdate 函数中读取用户输入。FixedUpdate 不会持续运行,因此有可能会错过用户输入。

只有Collider2D,没有Rigidbody2D的箱子

这是正确的。这是因为不需要通过物理来移动箱子,只需要一个碰撞体即可,无论有没有刚体游戏对象都将与箱子交互。

遮挡(排序问题)、轴点(Pivot)、碰撞体形状

  • ?排序问题:你需要让 Unity 根据游戏对象 y 坐标来绘制游戏对象。
    • ?Edit > Project Settings。
    • 在左侧类别菜单中,单击 Graphics。
    • Transparency Sort Mode 字段:此字段决定了精灵的绘制顺序。将此设置改为 Custom Axis、设置 x = 0? y = 1? z = 0
  • 轴点问题:将箱子、角色的轴点放在脚下,可以更好地解决遮挡的准确性。
    • 在游戏对象的 Sprite Renderer 组件上,找到 Sprite Sort Point 字段。目前,此字段设置为 Center,这意味着会使用精灵的中心点来决定这个游戏对象应该在另一个游戏对象的前面还是后面。将其改为 Pivot
    • 使用 Sprite Editor 来更改轴心,将轴心放在底部。
  • 碰撞体形状

  • ?为什么不把碰撞体设置成箱子的大小?那是因为你的角色需要能够走到箱子“后面”,这样看起来更合理(否则箱子在地面上看起来是扁平的)。
  • ?碰撞体仅覆盖了 Ruby 的双腿,因为角色在碰撞之前需要能够稍微移到游戏对象的上方,这有助于使游戏更真实可信。

使用复合碰撞体(制作地形)

  1. 父对象添加?Composite Collider 2D 组件
  2. 父对象添加?Rigidbody2D?组件,Rigidbody Body Type 属性设置为 Static(将此属性设置为 Static 将阻止你的世界移动。此外还有助于物理系统优化计算,因为它现在知道刚体不能移动。)
  3. 所有子对象的Collider2D ,启用 Used By Composite 复选框。

对象暂停移动时,检测不到碰撞

解决方法:在 Rigidbody 组件中将 Sleeping Mode 设置为 Never Sleep

为了优化资源,物理系统刚体停止移动时会停止计算刚体的碰撞;此时刚体进入“睡眠状态”。但在你这个情况中,你希望始终进行计算,因为即使在 Ruby 停止移动时也需要检测她是否受到伤害,因此你要指示刚体永远不要进入睡眠状态。

混合树(Blend Tree)

使用两个float值作为参数,控制动画状态的切换。直接看教程吧Sprite Animation - Unity LearnIn previous tutorials, you created a world that was full of objects, with a character that can move around and enemies to avoid. But so far, all that is very static. In this tutorial, you’ll add animation to your characters. Want to learn more about 2D Game Development with Unity? Connect with an expert Unity dev for a live 1:1 lesson.https://learn.unity.com/tutorial/jing-ling-dong-hua?uv=2019.4&projectId=5facf921edbc2a2003a58d3a#

比较浮点数?

使用 Mathf.Approximately 而不是 ==,这是因为计算机存储浮点数的方式意味着精度会有很小的损失。

检查move.x 或move.y 是否不等于0:

if(!Mathf.Approximately(move.x, 0.0f) || !Mathf.Approximately(move.y, 0.0f))

在Start函数中获取组件的问题

如果对象A是由其他对象的脚本实例化创建,紧接着调用对象A的某个函数,?报告了空引用的错误,需要检查Null的字段是否在对象AStart()? 中赋值的。

这是因为在你创建对象时 Unity 不会运行 Start,而是在下一帧才开始运行。因此,要解决此问题,请在Awake()中为该字段赋值。

与 Start 刚好相反,在创建对象时(调用 Instantiate 时)就会立即调用 Awake,因此,在调用任何函数之前已正确初始化需要赋值的字段。

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-01-29 23:24:16  更:2022-01-29 23:24:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 18:40:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码