Добрый день!
При запуске уровня камера работает как надо двигается за персонажем но когда происходит рестарт камера перестает работать, как можно устранить эту проблему?
Код
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(Camera))]
public class CameraController : MonoBehaviour
{
private enum Mode { Player, Cursor };
[SerializeField] private Mode face; // вектор смещения, относительно "лица" персонажа или положения курсора
[SerializeField] private float smooth = 2.5f; // сглаживание при следовании за персонажем
[SerializeField] private float offset; // значение смещения (отключить = 0)
[SerializeField] private SpriteRenderer boundsMap; // спрайт, в рамках которого будет перемещаться камера
[SerializeField] private bool useBounds = true; // использовать или нет, границы для камеры
private Transform player;
private Vector3 min, max, direction;
public static CameraController _use;
public Camera cam;
public static CameraController use
{
get { return _use; }
}
void Awake()
{
_use = this;
cam = GetComponent<Camera>();
cam.orthographic = true;
FindPlayer();
CalculateBounds();
}
// переключатель, для использования из другого класса
public void UseCameraBounds(bool value)
{
useBounds = value;
}
// найти персонажа, если он был уничтожен, а потом возрожден
// для вызова из другого класса, пишем: Camera2DFollowTDS.use.FindPlayer();
public void FindPlayer()
{
player = GameObject.FindGameObjectWithTag("Player").transform;
if (player) transform.position = new Vector3(player.position.x, player.position.y, transform.position.z);
}
// если в процессе игры, было изменено разрешение экрана
// или параметр "Orthographic Size", то следует сделать вызов данной функции повторно
public void CalculateBounds()
{
if (boundsMap == null) return;
Bounds bounds = Camera2DBounds();
min = bounds.max + boundsMap.bounds.min;
max = bounds.min + boundsMap.bounds.max;
}
Bounds Camera2DBounds()
{
float height = cam.orthographicSize * 2;
return new Bounds(Vector3.zero, new Vector3(height * cam.aspect, height, 0));
}
Vector3 MoveInside(Vector3 current, Vector3 pMin, Vector3 pMax)
{
if (!useBounds || boundsMap == null) return current;
current = Vector3.Max(current, pMin);
current = Vector3.Min(current, pMax);
return current;
}
Vector3 Mouse()
{
Vector3 mouse = Input.mousePosition;
mouse.z = -transform.position.z;
return cam.ScreenToWorldPoint(mouse);
}
void Follow()
{
if (face == Mode.Player) direction = player.right; else direction = (Mouse() - player.position).normalized;
Vector3 position = player.position + direction * offset;
position.z = transform.position.z;
position = MoveInside(position, new Vector3(min.x, min.y, position.z), new Vector3(max.x, max.y, position.z));
transform.position = Vector3.Lerp(transform.position, position, smooth * Time.deltaTime);
}
void LateUpdate()
{
if (player)
{
Follow();
}
}
}