障碍物和背景不会同时滚动

Posted

技术标签:

【中文标题】障碍物和背景不会同时滚动【英文标题】:Obstacles and Background not scrolling at the same time 【发布时间】:2019-02-01 11:15:54 【问题描述】:

我和一个大学的朋友有一个游戏创意,将障碍物汇集在一个对象池中,然后以与背景滚动(从右到左)相同的速度在屏幕上滚动(从右到左)以产生幻觉玩家的角色正在奔跑。到目前为止,这有效。

但是,我们想让背景和障碍物随着时间的推移逐渐增加速度,同时保持彼此相同的速度,以使游戏对用户来说更难。

我们在实现这一点时遇到了很多麻烦。最初我们试图为两个基本速度添加速度修改器,但这导致速度大不相同。我相信这与我们使用纹理偏移来移动背景的事实有关,但对于我们使用速度的障碍物。如果有帮助,所有东西(除了背景、相机、EventSystem 和 GameController)都在画布中,因为这是我们当时知道如何缩放的唯一方法。

那么,我们在这里做错了什么?

背景滚动代码:

using UnityEngine;

public class Background : MonoBehaviour


/*
 * 
 * A script that's sole purpose is to create a scrolling, infinite background.
 * Attached to: Brick
 * Scene: Level0
 *
 */

public float scrollSpeed;
private Vector2 savedOffset;
private Renderer rndrer;
private float conversionFactor = 0.1f;
public static Background instance;

private void Start()

    rndrer = GetComponent<Renderer>();
    savedOffset = rndrer.material.GetTextureOffset("_MainTex");


private void FixedUpdate()

    this.rndrer.material.SetTextureOffset("_MainTex", new Vector2((GameControl.speed * conversionFactor), 0));


private void OnDisable()

    rndrer.sharedMaterial.SetTextureOffset("_MainTex", savedOffset);


障碍滚动代码:

using UnityEngine;

public class ObstacleScrolling : MonoBehaviour


/*
 * 
 * A script which controls the movement of the Obstacles to make it look like the player is running towards them.
 * Attached to: [All Obstacles in the Prefabs folder]
 * Scene: Level0
 * 
 */

private Rigidbody2D rb2d;
public float scrollSpeed;
public float test;
GameObject canvasObj;
Canvas canvas;

// Use this for initialization
void Start()

    rb2d = GetComponent<Rigidbody2D>();

    canvasObj = GameObject.Find("Canvas");
    canvas = canvasObj.GetComponent<Canvas>();

    test = -1280 * canvas.scaleFactor;

    scrollSpeed = scrollSpeed * canvas.scaleFactor; //+ -(Time.timeSinceLevelLoad / 100);


// Update is called once per frame
void FixedUpdate()

    this.transform.Translate(Vector3.right * GameControl.speed);

    if (GameControl.instance.gameOver == true)
    
        rb2d.velocity = Vector2.zero;
    


【问题讨论】:

您应该在问题中包含您的代码,因为外部链接可能会过期。 @Draco18s 虽然它们很大,但我现在就去做。 背景和障碍物滚动速度不一样的原因是你没有考虑单位。偏移量以像素为单位。距离以米为单位。时间以秒为单位。速度以米/秒为单位。基本公式是:“增量距离 = 速度 * 增量时间”。在您的代码中,您使用时间(秒)作为偏移量(像素),并且希望它与速度(米/秒)匹配。 @JinJi 这就是我的想法。那么,你建议我们从哪里开始?我们做了一些调整,我在上面进行了编辑。 @jamesfromit 选择像素或“米”(或任何 Unity 的距离单位) - 但只保留其中一个并转换另一个。如果您选择像素,则必须将障碍物平移转换为像素(并以像素为单位保持背景偏移) - 如果选择“米”,则将背景偏移转换为米(并以米为单位保持障碍物平移)。转换系数见:***.com/questions/31501152/… 【参考方案1】:

使用这个:

public class GameControl : MonoBehaviour

private static float speedFactor = 1.0f; // you can set this to canvas scale
private static float speed = 1.0f;

public static float ScaledSpeed

    get
    
        return speed * speedFactor;
    


void FixedUpdate()

    speed += 0.01f * Time.deltaTime;


还有这个:

public class Background : MonoBehaviour

private Vector2 savedOffset;
private Vector2 offset;
private Renderer rndrer;
private float conversionFactor = 0.1f;

private void Start()

    rndrer = GetComponent<Renderer>();
    savedOffset = rndrer.material.GetTextureOffset("_MainTex");
    offset = savedOffset;


private void FixedUpdate()

    offset += new Vector2(GameControl.ScaledSpeed * conversionFactor, 0);
    this.rndrer.material.SetTextureOffset("_MainTex", offset);


还有这个:

public class ObstacleScrolling : MonoBehaviour

void FixedUpdate()

    this.transform.Translate(Vector3.right * GameControl.ScaledSpeed);


【讨论】:

到目前为止,一切顺利。我们无法添加 canvas.scaleFactor 以使体验在多种分辨率下保持一致。您对我们如何完成这项工作有什么建议吗? 我编辑了答案。使用float ScaledSpeed 而不是float speed。当分辨率改变时调整float speedFactor,如果需要,你也可以调整float conversionFactor 谢谢,它运行良好。答案被接受,享受代表。 :)

以上是关于障碍物和背景不会同时滚动的主要内容,如果未能解决你的问题,请参考以下文章

pygame障碍游戏将障碍直接画在背景中,实现用mask侦测背景中障碍和用颜色区分不同障碍的方法

pygame障碍游戏将障碍直接画在背景中,实现用mask侦测背景中障碍和用颜色区分不同障碍的方法

小米手机怎么开启无障碍服务

ros保存障碍物位置

超人游戏_将障碍画在背景中用pygame.mask.from_threshold实现超人和不同颜色障碍精准碰撞检测

超人游戏_将障碍画在背景中用pygame.mask.from_threshold实现超人和不同颜色障碍精准碰撞检测