游戏开发中的物理之运动角色(2D)

简介: 游戏开发中的物理之运动角色(2D)

介绍


是的,这个名字听起来很奇怪。“运动角色”。那是什么?该名称的原因是,当物理引擎问世时,它们被称为“动态”引擎(因为它们主要处理碰撞响应)。为了使用动态引擎创建角色控制器,已经进行了许多尝试,但是这并不像看起来那样容易。Godot是您可以找到的最佳动态角色控制器实现之一(如在2d / platformer演示中所见),但是使用它需要相当水平的技能和对物理引擎的理解(或者非常耐心尝试错误)。


诸如Havok之类的某些物理引擎似乎认为动态角色控制器是最佳选择,而其他物理引擎(PhysX)则更愿意推广运动学引擎。


那么区别是什么呢?:


甲动态字符控制器采用刚性体具有无限惯性张量。这是一个不能旋转的刚体。物理引擎总是让物体移动和碰撞,然后一起解决它们的碰撞。如平台游戏演示所示,这使动态角色控制器能够与其他物理对象无缝交互。但是,这些交互并非总是可预测的。碰撞可能需要一帧以上的时间才能解决,因此一些碰撞似乎只位移了一小部分。这些问题可以解决,但需要一定的技能。

一个运动人物控制器被假定为总是在非碰撞状态开始,并且会一直移动到非冲突状态。如果它开始处于碰撞状态,它将尝试像刚体一样释放自身,但这是例外,而不是规则。这使得它们的控制和运动更加可预测且易于编程。但是,不利的是,除非手动编写代码,否则它们无法直接与其他物理对象进行交互。

这个简短的教程将集中于运动字符控制器。基本上,这是老式的处理冲突的方式(不一定在幕后变得更简单,而是被很好地隐藏起来并作为一个很好的简单API呈现)。


物理过程


为了管理运动体或角色的逻辑,始终建议使用物理过程,因为它在物理步骤之前被调用,并且其执行与物理服务器同步,也总是被称为每秒相同的次数。与使用常规过程相比,这使物理和运动计算的工作方式更具可预测性,如果帧率太高或太低,则常规过程可能会出现尖峰或失去精度。


using Godot;
using System;
public class PhysicsScript : KinematicBody2D
{
    public override void _PhysicsProcess(float delta)
    {
    }
}


场景设定


有一些测试,这里的场景(从tilemap的教程) kbscene.zip。我们将为角色创建一个新场景。使用机器人精灵创建一个这样的场景:

image.png



您会注意到,我们的CollisionShape2D节点旁边有一个警告图标。这是因为我们尚未为其定义形状。在CollisionShape2D的shape属性中创建一个新的CircleShape2D。单击转到其选项,并将半径设置为30:


image.png


注意:如之前在物理教程中所述,物理引擎无法处理大多数形状的比例(仅碰撞多边形,平面和线段有效),因此请始终更改形状的参数(例如半径),而不是缩放它。运动/刚体/静态物体本身也是如此,因为它们的比例会影响形状比例。


现在,为角色创建一个脚本,上面用作示例的脚本应作为基础。


最后,在tilemap中实例化该角色场景,并将其作为主要场景,以便在按下play时运行。


image.png


运动学特征


回到角色场景,打开脚本,魔术开始了!运动体默认情况下不执行任何操作,但它具有一个有用的功能,称为 KinematicBody2D.move_and_collide()。此函数将Vector2用作参数,然后尝试将该运动应用于运动体。如果发生碰撞,它会在碰撞发生时立即停止。


因此,让我们向下移动精灵,直到它掉到地上:


using Godot;
using System;
public class PhysicsScript : KinematicBody2D
{
    public override void _PhysicsProcess(float delta)
    {
        // Move down 1 pixel per physics frame
        MoveAndCollide(new Vector2(0, 1));
    }
}


结果是角色将移动,但在撞击地板时会立即停止。太酷了吧?


下一步是将重力添加到混合中,这样,它的行为就有点像常规游戏角色:


using Godot;
using System;
public class PhysicsScript : KinematicBody2D
{
    const float gravity = 200.0f;
    Vector2 velocity;
    public override void _PhysicsProcess(float delta)
    {
        velocity.y += delta * gravity;
        var motion = velocity * delta;
        MoveAndCollide(motion);
    }
}

现在,角色平稳滑落。让我们在触摸方向键时向左右两侧行走。请记住,所使用的值(至少对于速度而言)是像素/秒。


这可以通过向左和向右按下来增加简单的步行支撑:


using Godot;
using System;
public class PhysicsScript : KinematicBody2D
{
    const float gravity = 200.0f;
    const int walkSpeed = 200;
    Vector2 velocity;
    public override void _PhysicsProcess(float delta)
    {
        velocity.y += delta * gravity;
        if (Input.IsActionPressed("ui_left"))
        {
            velocity.x = -walkSpeed;
        }
        else if (Input.IsActionPressed("ui_right"))
        {
            velocity.x = walkSpeed;
        }
        else
        {
            velocity.x = 0;
        }
        // We don't need to multiply velocity by delta because "MoveAndSlide" already takes delta time into account.
        // The second parameter of "MoveAndSlide" is the normal pointing up.
        // In the case of a 2D platformer, in Godot, upward is negative y, which translates to -1 as a normal.
        MoveAndSlide(velocity, new Vector2(0, -1));
    }
}

目录
相关文章
|
5月前
|
vr&ar
虚拟模特在现实生活中有什么应用场景
虚拟模特在现实生活中有什么应用场景
95 0
游戏开发中的物理之使用KinematicBody2D(02)
游戏开发中的物理之使用KinematicBody2D
260 0
游戏开发中的物理之使用KinematicBody2D(02)
|
14天前
|
传感器 编解码 算法
混合现实:虚拟与现实的交汇点
【10月更文挑战第3天】混合现实:虚拟与现实的交汇点
11 0
|
2月前
|
图形学 C#
超实用!深度解析Unity引擎,手把手教你从零开始构建精美的2D平面冒险游戏,涵盖资源导入、角色控制与动画、碰撞检测等核心技巧,打造沉浸式游戏体验完全指南
【8月更文挑战第31天】本文是 Unity 2D 游戏开发的全面指南,手把手教你从零开始构建精美的平面冒险游戏。首先,通过 Unity Hub 创建 2D 项目并导入游戏资源。接着,编写 `PlayerController` 脚本来实现角色移动,并添加动画以增强视觉效果。最后,通过 Collider 2D 组件实现碰撞检测等游戏机制。每一步均展示 Unity 在 2D 游戏开发中的强大功能。
135 6
|
2月前
|
开发者 图形学 Java
揭秘Unity物理引擎核心技术:从刚体动力学到关节连接,全方位教你如何在虚拟世界中重现真实物理现象——含实战代码示例与详细解析
【8月更文挑战第31天】Unity物理引擎对于游戏开发至关重要,它能够模拟真实的物理效果,如刚体运动、碰撞检测及关节连接等。通过Rigidbody和Collider组件,开发者可以轻松实现物体间的互动与碰撞。本文通过具体代码示例介绍了如何使用Unity物理引擎实现物体运动、施加力、使用关节连接以及模拟弹簧效果等功能,帮助开发者提升游戏的真实感与沉浸感。
59 1
|
2月前
|
开发者 图形学 Java
Unity物理引擎深度揭秘:从刚体碰撞到软体模拟,全面解析实现复杂物理交互的技巧与秘诀,助你打造超真实游戏体验
【8月更文挑战第31天】物理模拟在游戏开发中至关重要,可让虚拟世界更真实。Unity作为强大的跨平台游戏引擎,内置物理系统,支持从刚体碰撞到布料模拟的多种功能。通过添加Rigidbody组件,可实现物体受力和碰撞;使用AddForce()施加力;通过关节(如Fixed Joint)连接刚体以模拟复杂结构。Unity还支持软体物理,如布料和绳索模拟,进一步增强场景丰富度。掌握这些技术,可大幅提升游戏的真实感和玩家体验。
68 0
|
1月前
|
图形学 开发者
透视与正交之外的奇妙视界:深入解析Unity游戏开发中的相机与视角控制艺术,探索打造沉浸式玩家体验的奥秘与技巧
【8月更文挑战第31天】在Unity中,相机不仅是玩家观察游戏世界的窗口,更是塑造氛围和引导注意力的关键工具。通过灵活运用相机系统,开发者能大幅提升游戏的艺术表现力和沉浸感。本文将探讨如何实现多种相机控制,包括第三人称跟随和第一人称视角,并提供实用代码示例。
87 0
|
10月前
|
编译器 图形学 开发者
Unity例子——第一人称视角的角色控制器
Unity例子——第一人称视角的角色控制器
186 0
|
传感器 物联网 开发者
5_2_1_光照信息屏_ 实验技术点及应用场景介绍|学习笔记
快速学习5_2_1_光照信息屏_实验技术点及应用场景介绍。
166 0
5_2_1_光照信息屏_ 实验技术点及应用场景介绍|学习笔记
|
图形学
哪里可以学3D次世代角色建模?具体学什么东西?
2009年3D电影《阿凡达》横空出世,3D技术随之进入了公众视线,3D建模通俗来讲就是通过三维制作软件通过虚拟三维空间构建出具有三维数据的模型。游戏行业也是搭乘国家文化政策的顺风车,正处于蓬勃发展阶段,游戏产业对游戏3D建模师的需求非常大,每一款众人皆知的经典,从二次元到三次元,许多一眼就能认出的任务角色,都是由3D游戏建模师制作而成。
114 0
哪里可以学3D次世代角色建模?具体学什么东西?