Потратил уже достаточно времени, постепенно пришел к другому решению - незачем скроллить текстуру, возможно и правда много памяти отъест программа, поэтому придумал более простое решение - двигать плоскость с бэкграундом вместе с игроком. Формула такова: координата плоскости = предыдущая позиция + скорость движения игрока + поправочный коэффициент. Получается немного горбато, она движется то быстро, то медленно, не в такт одним словом. Игрок двигается так:
Используется csharp
player.position += player.forward * speed * Time.deltaTime;
А плоскость так двигать не получится, только через задание координат Vector3. Вот код:
Используется csharp
void Update () {
pos = new Vector3(player.position.x, transform.position.y, player.position.z);
// Дельта позиций игрока
float dposX = pos.x - oldpos.x;
float dposZ = pos.z - oldpos.z;
// Получаем скорость игрока из другого скрипта
float playerSpeed = player.GetComponent<PlayerControl>().speed;
// Поправочный коэффициент
if(dposX > 0){ moveX = playerSpeed + (-0.0005f); }
else if(dposX < 0){ moveX = playerSpeed * 0.0005f; }
else{ moveX = 0; }
if(dposZ > 0){ moveZ = playerSpeed + (-0.0005f); }
else if(dposZ < 0){ moveZ = playerSpeed + 0.0005f; }
else{ moveZ = 0; }
transform.position = new Vector3(transform.position.x + moveX, transform.position.y, transform.position.z + moveZ);
oldpos = new Vector3(player.position.x, transform.position.y, player.position.z);
}
Возможно, всё делается намного проще, чем делаю я...
UPDATE. Посидел, поковырялся и сделал то, что надо. Скорость игрока берем из дельты позиций - вот оказалось вовсе простое решение. Выкладываю код, может кому понадобится:
Используется csharp
using UnityEngine;
using System.Collections;
public class Background : MonoBehaviour {
public Transform player;
private float scrollSpeed = 0.03f;
private Vector3 pos;
private Vector3 oldpos;
private float moveX;
private float moveZ;
// Use this for initialization
void Start () {
// Условная позиция, может быть любая
transform.position = new Vector3(player.position.x, transform.position.y, player.position.z);
oldpos = new Vector3(0,0,0);
moveX = 0;
moveZ = 0;
}
// Update is called once per frame
void Update () {
pos = new Vector3(player.position.x, transform.position.y, player.position.z);
// Дельта позиций игрока
float dposX = pos.x - oldpos.x;
float dposZ = pos.z - oldpos.z;
// Z- вниз, Z+ вверх, X- влево, X+ вправо (поправочные коэффициенты)
if(dposX > 0){ moveX = -scrollSpeed; }
else if(dposX < 0){ moveX = scrollSpeed; }
else{ moveX = 0; }
if(dposZ > 0){ moveZ = -scrollSpeed; }
else if(dposZ < 0){ moveZ = scrollSpeed; }
else{ moveZ = 0; }
// Двигаем задник по позиции игрока + поправочный коэффициент
transform.position = new Vector3(transform.position.x + dposX + moveX, transform.position.y, transform.position.z + dposZ + moveZ);
oldpos = new Vector3(player.position.x, transform.position.y, player.position.z);
}
}