Witam!
Od niedawna zacząłem przygodę z Unity3D(chyba po raz drugi) i postanowiłem, że skrypty będę pisał sam(czyli że nie będę korzystał z gotowców) i pojawił się problem z kamerą postaci. Ogólnie problem nie polega na tym, że nie umiem wprowadzić kamery w ruch, żeby się obracała, tylko na tym, że jak już ją obracam, to o ile jeśli obracam tylko w pionie, lub tylko w poziomie to obrót działa bez zarzutu, to o ile spróbuję obrócić i w pionie i w poziomie(po skosie), to kamera się jakoś tak wykrzywia(a dokładniej zmienia się oś Z, a nie powinna). Poniżej wklejam skrypt, którego użyłem do obrotu kamery:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Character : MonoBehaviour
{
// Use this for initialization
void Start()
{
}
void poruszanie()
{
if (Input.GetKey(KeyCode.W))
{
transform.Translate(Vector3.forward * Time.deltaTime * 2);
if (Input.GetKey(KeyCode.W) & Input.GetKey(KeyCode.LeftShift))
{
transform.Translate(Vector3.forward * Time.deltaTime * 10);
}
}
if (Input.GetKey(KeyCode.A))
{
transform.Translate(Vector3.left * Time.deltaTime * 1);
if (Input.GetKey(KeyCode.A) & Input.GetKey(KeyCode.LeftShift))
{
transform.Translate(Vector3.left * Time.deltaTime * 5);
}
}
if (Input.GetKey(KeyCode.S))
{
transform.Translate(Vector3.back * Time.deltaTime * 1);
if (Input.GetKey(KeyCode.S) & Input.GetKey(KeyCode.LeftShift))
{
transform.Translate(Vector3.back * Time.deltaTime * 5);
}
}
if (Input.GetKey(KeyCode.D))
{
transform.Translate(Vector3.right * Time.deltaTime * 1);
if (Input.GetKey(KeyCode.D) & Input.GetKey(KeyCode.LeftShift))
{
transform.Translate(Vector3.right * Time.deltaTime * 5);
}
}
}
void obracaniex()
{
if (Input.GetAxis("Mouse X") < 0)
{
transform.Rotate(0, (-Time.deltaTime * 100), 0);
}
if (Input.GetAxis("Mouse X") > 0)
{
transform.Rotate(0, (Time.deltaTime * 100), 0); // Na początku funkcji obracania nie rozbijałem na obracaniex() i obracaniey(), ale zrobiłem to mając nadzieję na poprawę
}
}
void obracaniey()
{
if (Input.GetAxis("Mouse Y") < 0)
{
transform.Rotate((Time.deltaTime * 100), 0, 0);
}
if (Input.GetAxis("Mouse Y") > 0)
{
transform.Rotate((-Time.deltaTime * 100), 0, 0);
}
}
// Update is called once per frame
void Update ()
{
obracaniex();
obracaniey();
poruszanie();
}
}
//Edit1:
Dobra, już uporałem się z tym problemem, wystarczyło stworzyć trzy zmienne xRotation, yRotation i zRotation oraz po funkcjach obracaniex() i obracaniey() dopisać tą linijkę:
transform.eulerAngles = new Vector3(xRotation, yRotation, zRotation);
przez co cały kod wygląda tak(podaję go jakby ktoś chciałby go użyć w swoim projekcie Unity3D):
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Character : MonoBehaviour
{
private float xRotation;
private float yRotation;
private float zRotation=0;
// Use this for initialization
void Start()
{
}
void poruszanie()
{
if (Input.GetKey(KeyCode.W))
{
transform.Translate(Vector3.forward * Time.deltaTime * 2);
if (Input.GetKey(KeyCode.W) & Input.GetKey(KeyCode.LeftShift))
{
transform.Translate(Vector3.forward * Time.deltaTime * 10);
}
}
if (Input.GetKey(KeyCode.A))
{
transform.Translate(Vector3.left * Time.deltaTime * 1);
if (Input.GetKey(KeyCode.A) & Input.GetKey(KeyCode.LeftShift))
{
transform.Translate(Vector3.left * Time.deltaTime * 5);
}
}
if (Input.GetKey(KeyCode.S))
{
transform.Translate(Vector3.back * Time.deltaTime * 1);
if (Input.GetKey(KeyCode.S) & Input.GetKey(KeyCode.LeftShift))
{
transform.Translate(Vector3.back * Time.deltaTime * 5);
}
}
if (Input.GetKey(KeyCode.D))
{
transform.Translate(Vector3.right * Time.deltaTime * 1);
if (Input.GetKey(KeyCode.D) & Input.GetKey(KeyCode.LeftShift))
{
transform.Translate(Vector3.right * Time.deltaTime * 5);
}
}
}
void obracaniex()
{
if (Input.GetAxis("Mouse X") < 0)
{
transform.Rotate(0, (-Time.deltaTime * 100), 0);
}
if (Input.GetAxis("Mouse X") > 0)
{
transform.Rotate(0, (Time.deltaTime * 100), 0); // Na początku funkcji obracania nie rozbijałem na obracaniex() i obracaniey(), ale zrobiłem to mając nadzieję na poprawę
}
}
void obracaniey()
{
if (Input.GetAxis("Mouse Y") < 0)
{
transform.Rotate((Time.deltaTime * 100), 0, 0);
}
if (Input.GetAxis("Mouse Y") > 0)
{
transform.Rotate((-Time.deltaTime * 100), 0, 0);
}
}
// Update is called once per frame
void Update ()
{
obracaniex();
obracaniey();
xRotation = transform.eulerAngles.x;
yRotation = transform.eulerAngles.y;
transform.eulerAngles = new Vector3(xRotation, yRotation, zRotation);
poruszanie();
}
}
Zamykam Temat