76 lines
2.6 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|