障碍物和背景不会同时滚动
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侦测背景中障碍和用颜色区分不同障碍的方法