介绍
游戏中,有时候需要反复使用一张图,但是无限拼接一张图特别麻烦
using UnityEngine;
public class MovingBackground : MonoBehaviour
{
public float backgroundSpeed = 5f; // 移动速度
private Renderer bgRenderer; // 纹理渲染器对象
private Vector2 offset = Vector2.zero; // 偏移量
void Start()
{
bgRenderer = GetComponent<Renderer>(); // 获取纹理渲染器组件
}
void Update ()
{
// 计算新偏移量,并向右移动图片
offset += new Vector2(backgroundSpeed * Time.deltaTime, 0);
// 若 x 坐标超出范围则设置为 0,从而实现循环
if (offset.x > 1f)
{
offset.x = 0;
}
bgRenderer.material.SetTextureOffset("_MainTex", offset); // 更新材质偏移量
}
}
创建了一个名为MovingBackground的组件,并添加到 Sprite 图片所在的 GameObject 上。Start() 函数将获取该 Sprite 对象对应的纹理渲染器对象,Update() 函数将计算新的偏移量,在每一帧更新材质的偏移量 _MainTex,以实现图像向右不停滚动并且不会产生空隙。
需要注意的是,这段代码只可以实现平滑地滚动 Sprite 图片,若想要达到其它类型的效果,例如随机滚动、按照曲线移动等,可能需要考虑使用其它类型的算法或者技术手段。同时也需要注意,该技术会消耗一些系统开销,对于性能敏感的应用场景需要进行优化。
方法一
Unity 中更改材质的偏移量
bg.material.SetTextureOffset(“_MainTex”, new Vector2(0, Time.time / 5));
方法二
unity对图片进行瞬移
public class BackgroundController : MonoBehaviour
{
// 用于移动的速度
public float backgroundSpeed = 5f;
// 当前背景图的 x 坐标
private float currentBackgroundX;
// 背景图的宽度
private float backgroundWidth;
// 引用需要滚动的背景缓存对象
private Transform backgroundTransform;
void Start()
{
// 获取需要滚动的背景缓存对象的 Transform 组件
backgroundTransform = transform.Find("Background");
// 获取背景图的宽度
backgroundWidth = backgroundTransform.GetComponent<SpriteRenderer>().bounds.size.x;
// 初始化当前背景图的 x 坐标
currentBackgroundX = backgroundTransform.position.x;
}
void Update()
{
// 让当前背景图向左移动
currentBackgroundX -= backgroundSpeed * Time.deltaTime;
// 如果背景图已经完全移出屏幕左侧,应该将其瞬移至屏幕右侧
if (currentBackgroundX <= -backgroundWidth / 2)
{
currentBackgroundX += backgroundWidth;
}
// 更新当前背景图所在的位置
backgroundTransform.position = new Vector3(currentBackgroundX, 0, 0);
}
}
缺点:需要根据需要调节数值,很麻烦