游戏开发中的物理之运动角色(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));
    }
}

目录
相关文章
游戏开发中的物理之使用KinematicBody2D(02)
游戏开发中的物理之使用KinematicBody2D
268 0
游戏开发中的物理之使用KinematicBody2D(02)
|
3月前
|
开发者 图形学 Java
Unity物理引擎深度揭秘:从刚体碰撞到软体模拟,全面解析实现复杂物理交互的技巧与秘诀,助你打造超真实游戏体验
【8月更文挑战第31天】物理模拟在游戏开发中至关重要,可让虚拟世界更真实。Unity作为强大的跨平台游戏引擎,内置物理系统,支持从刚体碰撞到布料模拟的多种功能。通过添加Rigidbody组件,可实现物体受力和碰撞;使用AddForce()施加力;通过关节(如Fixed Joint)连接刚体以模拟复杂结构。Unity还支持软体物理,如布料和绳索模拟,进一步增强场景丰富度。掌握这些技术,可大幅提升游戏的真实感和玩家体验。
106 0
|
2月前
|
图形学 开发者
透视与正交之外的奇妙视界:深入解析Unity游戏开发中的相机与视角控制艺术,探索打造沉浸式玩家体验的奥秘与技巧
【8月更文挑战第31天】在Unity中,相机不仅是玩家观察游戏世界的窗口,更是塑造氛围和引导注意力的关键工具。通过灵活运用相机系统,开发者能大幅提升游戏的艺术表现力和沉浸感。本文将探讨如何实现多种相机控制,包括第三人称跟随和第一人称视角,并提供实用代码示例。
131 0
|
6月前
横版游戏中角色的移动控制是如何实现的?
横版游戏中角色的移动控制是如何实现的?
55 0
|
6月前
实现横版游戏中角色的跳跃控制是如何实现的?
实现横版游戏中角色的跳跃控制是如何实现的?
55 0
|
11月前
|
编译器 图形学 开发者
Unity例子——第一人称视角的角色控制器
Unity例子——第一人称视角的角色控制器
197 0
|
定位技术
游戏设计 -人物移动广播优化
游戏设计 -人物移动广播优化
38 0
如何实现横版游戏中角色的移动控制
今天分享一下横版游戏中角色的移动控制,在一个 2D 的横版游戏中,对于游戏角色的移动控制,其实只需要考虑水平方向上即可。如果角色可以跳跃的话,才需要去考虑垂直方向上的移动,这篇文章只涉及到水平方向上的角色移动控制。
84 0
如何实现横版游戏中角色的跳跃控制
在写完上一篇[如何实现横版游戏中角色的移动控制]后,有朋友留言:再来个跳跃的。所以,这篇就来了,这篇教程中我将带大家来了解两种实现角色跳跃的方法,一种是利用"物理"实现跳跃控制,另外一种是使用工具为我们提供的“平台角色”行为,来实现角色的跳跃。 利用物理实现角色的跳跃控制
96 0
|
图形学
哪里可以学3D次世代角色建模?具体学什么东西?
2009年3D电影《阿凡达》横空出世,3D技术随之进入了公众视线,3D建模通俗来讲就是通过三维制作软件通过虚拟三维空间构建出具有三维数据的模型。游戏行业也是搭乘国家文化政策的顺风车,正处于蓬勃发展阶段,游戏产业对游戏3D建模师的需求非常大,每一款众人皆知的经典,从二次元到三次元,许多一眼就能认出的任务角色,都是由3D游戏建模师制作而成。
117 0
哪里可以学3D次世代角色建模?具体学什么东西?