CameraOrbit

Programowanie w Unity.

CameraOrbit

Postprzez niffe3333 » 13 Maj 2019, 13:51

Witam . Mam taki problem , że chciałbym aby po naciśnięciu prawego przycisku myszy pobrało aktualną pozycje kamery i abym mógł nią obracać . Skrypt polega na tym, że gdy gracz nic nie klika kamera płynnie leci za nim. Gdy naciśnie się prawy przycisk myszy powinno dać się obracać wokoło gracza. Skrypt działa , niestety pojawiają się problemy. Np Gdy nacisnę prawy przycisk myszy pobiera jakby ostatnio zapamiętaną pozycję po kliknięciu myszy a nie aktualną . Więc po naciśnięciu przycisku nagle kamera pojawia się np z prawej strony gracza zamiast płynnie tam gdzie się znajduje,



Skrypt trzeba dodać do kamery a do zmiennej target przypisać gracza,

https://pastebin.com/PTVXNLBZ
niffe3333
 
Posty: 1
Rejestracja: 13 Maj 2019, 13:49
Has thanked: 0 time
Been thanked: 0 time

Re: CameraOrbit

Postprzez Wichur » 14 Maj 2019, 06:00

Nie jestem pewien, tak na sucho mysle, że _cameraOffset powinna byc tez liczona w funkcji camerasmooth
Awatar użytkownika
Wichur
 
Posty: 123
Rejestracja: 19 Gru 2017, 10:33
Miejscowość: Pruszcz Gdański
Has thanked: 0 time
Been thanked: 0 time

Re: CameraOrbit

Postprzez WojciechX » 15 Maj 2019, 10:31

Napisałem twój kod, bo nie rozumiem co chciałeś opisać, skorzystaj. Jeśli chcesz, żeby kamera się poruszała płynnie, to skorzystaj z Vector3.Lerp:
Kod: Zaznacz wszystko
transform.position = Vector3.Lerp(transform.position, target.position + Vector3.up * cameraHeight, 15.0f * Time.deltaTime);
transform.position -= transform.forward * CameraSight(cameraDistance);

To drugie jest istotne, że nie jest w lerpie, bo nie będzie mierzyć dokładnej odległości

Tu masz mój kodzik, mogłem coś namieszać, bo pisałem w notatniku, ale mniejsza :) to ma Cię naprowadzić.
PS. Zawsze wrzucam CameraSight, żeby wykrywała przeszkody, możesz użyć również LayerMask, żeby pomijała kolizję gracza(dając mu layer: Player) i odznaczając ten layer na sterowaniu kamerą.

Kod: Zaznacz wszystko
[SerializeField]
private LayerMask castLayer;


A tak wygląda funkcja do castowania z layerMaskiem
Kod: Zaznacz wszystko
Physics.SphereCast(transform.position, castRadius, -transform.forward, out hit, distance, castLayer)


Kod: Zaznacz wszystko
using UnityEngine;

public class CameraController : MonoBehaviour
{
   [SerializeField]
   private float
      cameraHeight = 1.75f,
      cameraDistance = 3.0f,
      cameraSensitivity = 1.0f;
   
   [SerializeField]
   private float
      yMin = -75.0f,
      yMax = 75.0f;
   
   private Vector3 cameraRotation;
   [SerializeField]
   private Transform target;

   private void OnEnable()
   {
      cameraRotation = transform.eulerAngles;
   }
   
   private void Update()
   {
      if(Input.GetMouseButton(1))
      {
         cameraRotation += new Vector3(-Input.GetAxis("Mouse Y"), Input.GetAxis("Mouse X"), 0.0f) * cameraSensitivity;
      }
      else
      {
         cameraRotation = Quaternion.Lerp(Quaternion.Euler(cameraRotation), Quaternion.LookRotation(target.forward), 5.0f * Time.deltaTime).eulerAngles;
      }
      
      cameraRotation.x = Mathf.Clamp(cameraRotation.x, yMin, yMax);
      if(cameraRotation.y < 0.0f)
         cameraRotation.y += 360.0f;
      else if(cameraRotation.y > 360.0f)
         cameraRotation.y -= 360.0f;
      cameraRotation.z = 0.0f;
      
      transform.eulerAngles = cameraRotation;
      
      transform.position = target.position + Vector3.up * cameraHeight;
      transform.position -= transform.forward * CameraSight(cameraDistance);
   }
   
   private float CameraSight(float distance, float castRadius = 0.125f)
   {
      RaycastHit hit;
      if(Physics.SphereCast(transform.position, castRadius, -transform.forward, out hit, distance))
         return Vector3.Distance(transform.position, hit.transform.position) - castRadius;
      return distance;
   }
}
Awatar użytkownika
WojciechX
 
Posty: 46
Rejestracja: 06 Lis 2014, 16:09
Has thanked: 0 time
Been thanked: 0 time


Wróć do Skrypty

Kto jest na forum

Użytkownicy przeglądający to forum: Brak zarejestrowanych użytkowników oraz 1 gość

cron