Files
NinJump-Unity/NinJump/Assets/Scripts/Game/PlayerCamera.cs
T
2022-10-17 23:53:04 +02:00

76 lines
2.6 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerCamera : MonoBehaviour
{
[SerializeField] private GameObject player;
//abstand zwischen kamera und spieler
private float yOffset;
private float defaultYOffset;
//interpolationsfaktor zwischen spieler und kameraposition
private float i = 0;
private float speedFactor = 50;
//ruckler im spiele vermeiden, aber kamera trotzdem flüssig bewegen
private const float cameraAccuracy = 100f;
private void Start()
{
//abstand kamera - spieler berechnen
yOffset = transform.position.y - player.transform.position.y;
defaultYOffset = yOffset;
}
private void FixedUpdate()
{
//kamera auf der x-Achse bewegen
transform.Translate(player.transform.position.x - transform.position.x, 0, 0);
//kamera werte runden, um bildfehler zu vermeiden
transform.position = new Vector3(Mathf.Round(transform.position.x * cameraAccuracy) / cameraAccuracy,
Mathf.Round(transform.position.y * cameraAccuracy) / cameraAccuracy, -10);
//kamera in die niedrigste position snappen
if (transform.position.y < 0.01f)
{
transform.position = new Vector3(transform.position.x, 0,
-10);
}
//kamera schnell nach unten bewegen
if (player.transform.position.y < -1.8f && transform.position.y > 0)
{
yOffset = defaultYOffset;
speedFactor = 10f;
}
//normale kamera steuerung in höherem terrain
else
{
yOffset = 0;
speedFactor = 50;
}
//interpolieren zwischen player - kamera um weiches verfolgen des spielers zu ermöglichen
if ((player.transform.position.y >= 2f && player.transform.position.y <= 10f ||
transform.position.y > 0 && player.transform.position.y <= 10f) && transform.position.y <= 8.31f)
{
transform.position = Vector2.Lerp(transform.position, player.transform.position + Vector3.up * yOffset, i);
transform.position = new Vector3(transform.position.x, transform.position.y, -10);
i += Time.deltaTime / speedFactor;
}
//keine interpolation ist das niedrigste terrain-level erreicht
else if (player.transform.position.y < 2f)
{
i = 0;
}
//fehlerhafte kamera werte ausgleichen (y)
if (player.transform.position.y < 6.35f && transform.position.y > 8.31f)
{
transform.position = new Vector3(transform.position.x, 8.31f, -10);
}
}
}