Unity小游戏——无限滚动的背景的改良

简介: Unity小游戏——无限滚动的背景的改良

在上文介绍的算法中,背景只在每次调用Update()时移动一次。这样一来,如果武士移动的距离很长,即速度很快,就可能出现背景和角色移动不协调的情况.虽然我们这个游戏中不会打到那样快的移动速度,但是有些游戏中出现过玩家校色移动,或者在场景中移动到错误位置的现象。下面就让我们来考虑一下这种情况的解决办法

一、稍作尝试

下列是摁下w键后向前突刺的代码

// 通过“W”键向前方大幅移动(用于调试)
#if UNITY_EDITOR
        if(Input.GetKeyDown(KeyCode.W)) {
          Vector3   position = this.transform.position;
          position.x += 100.0f*FloorControl.WIDTH*FloorControl.MODEL_NUM;
          this.transform.position = position;
        }

结果是角色移动的距离太长,背景跟不上角色了

二、背景组件显示位置的良改

在上文中,我们提到了相同类型的背景组件的背景组件会按照“total_width=一个组件的宽度×组件数量(3个)”的间隔重复出现。也就是说,程序将从下列值中,初始位置、初始位置+total_width×1、初始位置+total_width×2、初始位置+total_width×3、初始位置+total_width×4......初始位置+total_width×n中选取一个最靠近武士坐标的值作为背景组件出现的位置。因此,质押求出上面的n的值,就可以确定背景应该出现的位置。

接下来,让我们看看改良后的FloorControl.Update方法

void  Update()
{
float   total_width = FloorControl.WIDTH*FloorControl.MODEL_NUM;
    Vector3   camera_position = this.main_camera.transform.position;
    float   dist = camera_position.x - this.initial_position.x;
    // 模型出现在total_width 的整数倍位置
    // 用初始位置的距离除以整体背景的宽度,再四舍五入
    int     n = Mathf.RoundToInt(dist/total_width);
    Vector3   position = this.initial_position;
    position.x += n*total_width;
    this.transform.position = position;
}

上述代码中,dist是武士的移动距离。将dist除以背景组件的整体宽度total_width后的结果赋值给n

n是整数,但是经触发求出的结果并不一定是整数,因此把结果代入n之前,需要现做四舍五入处理。如果只是简单地进行类型转换(cast),将直接舍去小数部分,务必注意这一点

使用四舍五入,是为了在舍去和进位两种情况中选取最靠近武士坐标的情况。

我们可以使用Mathf.RoundToInt方法来实现四舍五入。MathfUnity中的一个功能类。它含有很多剧本的数学计算功能。

还有一种实现四舍五入的方法:让数字加上0.5后再舍去小数部分。可以利用Mathf.FloorToInt方法舍去小数部分

Mathf.RoundToInt(dist/total_width);    //四舍五入

Mathf.FloorToInt(dist/total_width+0.5f);   //加上0.5后社区小数部分(效果等同于四舍五入)

使用RoundToInt和FloorToInt方法时,需要注意输入值为负数的情况。RoundToInt直接对绝对值进行操作,而FloorToInt则会连同符号判断数值大小

下面是Unity官网的解释

RoundToInt

返回舍入为最近整数的 /f/。

如果数字结尾是 .5,从而使它处于两个整数正中间(其中一个是偶数,另一个是奇数),则返回偶数。

FloorToInt

返回小于或等于 f 的最大整数。

在本游戏中,武士的坐标只取正数,由于即使武士会往相反的方向移动也要判定“更近的一段”,因此程序中使用的RoundToInt方法。反在某些游戏中,则可能需要找出“更靠近左边的一端”,这种情况下就应该使用FloorToInt方法。总之,我们应当依据不同的情况灵活选择最好的方法。


相关文章
|
9月前
|
图形学
【制作100个unity游戏之28】花半天时间用unity复刻童年4399经典小游戏《黄金矿工》(附带项目源码)
【制作100个unity游戏之28】花半天时间用unity复刻童年4399经典小游戏《黄金矿工》(附带项目源码)
306 0
|
图形学
Unity小游戏——迷你拼图
Unity小游戏——迷你拼图
320 1
|
图形学
Unity小游戏——使被砍中的怪物四处飞散
Unity小游戏——使被砍中的怪物四处飞散
119 1
|
图形学
unity小游戏——得分高低的判定
unity小游戏——得分高低的判定
|
算法 图形学
Unity小游戏——武士击杀小怪兽(无限滚动的背景)
Unity小游戏——武士击杀小怪兽(无限滚动的背景)
|
10月前
|
图形学
【Unity3D开发小游戏】Unity3D零基础一步一步教你制作跑酷类游戏
【Unity3D开发小游戏】Unity3D零基础一步一步教你制作跑酷类游戏
|
图形学
Unity小游戏——武士和怪物的碰撞检测
Unity小游戏——武士和怪物的碰撞检测
120 0
|
图形学
Unity小游戏——怪物出现模式的管理
Unity小游戏——怪物出现模式的管理
162 0
|
7月前
|
图形学 C#
超实用!深度解析Unity引擎,手把手教你从零开始构建精美的2D平面冒险游戏,涵盖资源导入、角色控制与动画、碰撞检测等核心技巧,打造沉浸式游戏体验完全指南
【8月更文挑战第31天】本文是 Unity 2D 游戏开发的全面指南,手把手教你从零开始构建精美的平面冒险游戏。首先,通过 Unity Hub 创建 2D 项目并导入游戏资源。接着,编写 `PlayerController` 脚本来实现角色移动,并添加动画以增强视觉效果。最后,通过 Collider 2D 组件实现碰撞检测等游戏机制。每一步均展示 Unity 在 2D 游戏开发中的强大功能。
381 6
|
7月前
|
图形学 缓存 算法
掌握这五大绝招,让您的Unity游戏瞬间加载完毕,从此告别漫长等待,大幅提升玩家首次体验的满意度与留存率!
【8月更文挑战第31天】游戏的加载时间是影响玩家初次体验的关键因素,特别是在移动设备上。本文介绍了几种常见的Unity游戏加载优化方法,包括资源的预加载与异步加载、使用AssetBundles管理动态资源、纹理和模型优化、合理利用缓存系统以及脚本优化。通过具体示例代码展示了如何实现异步加载场景,并提出了针对不同资源的优化策略。综合运用这些技术可以显著缩短加载时间,提升玩家满意度。
644 5