Ostatnio postanowiłem, że krok po kroku zaprogramuję Third Person Controller bez użycia żadnych assetów z zewnątrz. Jestem jak na razie (dopiero) w trakcie pisania skryptu na zoom kamery od/do postaci. Chciałem go dopracować maksymalnie - oprócz ruchu w osi
Z i
Y, bardzo pragnąłem dodać obrót kamery w osi
X. Niestety po napisaniu poniższego kodu, oś obrotu
X ma wartość 180. Domniemuję, że jest to spowodowane moim brakiem wiedzy odnośnie Quaternionów, nie wiem po jakiego grzyba nie może być po prostu użyty tu zwykły Vector3 dla osi
x,
y,
z. Musi być tu jeszcze
w, którego istoty istnienia nie rozumiem.
(Po zmianie jego wartości na przykładowo 180, kamera wariuje). Co mam poprawić, aby działało tak, jak powinno?
using UnityEngine;
using System.Collections;
public class CharCamera : MonoBehaviour {
//Zmienne odpowiedzialne za przybliżanie kamery:
[Header("Zoom")]
public Transform cam;
public float minY = 1.15f;
public float maxY = 9.0f;
public float minZ = -4.0f;
public float maxZ = -20.0f;
public float minXRot = 0.0f;
public float maxXRot = 15.0f;
public float smoothTime = 0.4f;
public float szybkosc = 0.4F;
private float actualY = 2.0f;
private float actualZ = -6.0f;
private float actualXRot;
private Vector3 speedTrans = Vector3.zero;
private float speedRotX = 0.0f;
void Update () {
//Zoom && Smooth Zoom:
if (Input.GetAxis("Mouse ScrollWheel") < 0) // forward
{
if(actualY < maxY)
actualY = actualY + szybkosc * Mathf.Abs((maxY - minY) / (maxZ - minZ));
if(actualZ > maxZ)
actualZ = actualZ - szybkosc;
if(actualXRot < maxXRot)
actualXRot = actualXRot + szybkosc * Mathf.Abs((maxY - minY) / (maxZ - minZ));
}
if (Input.GetAxis("Mouse ScrollWheel") > 0) // back
{
if(actualY > minY)
actualY = actualY - szybkosc * Mathf.Abs((maxY - minY) / (maxZ - minZ));
if(actualZ < minZ)
actualZ = actualZ + szybkosc;
if (actualXRot > minXRot)
actualXRot = actualXRot - szybkosc * Mathf.Abs((maxY - minY) / (maxZ - minZ));
}
Vector3 basicPosition = new Vector3(0, actualY, actualZ);
float basicRotationX = actualXRot;
Vector3 smoothPosition = Vector3.SmoothDamp(cam.localPosition, basicPosition, ref speedTrans, smoothTime);
float smoothRotationX = Mathf.SmoothDamp(cam.localRotation.x, basicRotationX, ref speedRotX, smoothTime);
cam.localPosition = smoothPosition;
cam.localRotation = new Quaternion(smoothRotationX, 0, 0, 0);
}
}
Z góry dziękuję za pomoc. ;)