Poruszanie obiektem do przodu.

Programowanie w Unity.

Poruszanie obiektem do przodu.

Postprzez Nikan » 22 Maj 2019, 16:47

Witam, mam pewien problem.
Otóż chcę przesuwać obiektem do przodu(względem jego osi) niezależnie od jego rotacji, który składa się z kilku obiektów.
Ruch ma być do przodu, czyli tam gdzie obiekt ma "swoją twarz", czyli jeżeli jego rotacja wynosi 0, 0, 0 to porusza się do przodu, jak zmienię jego rotację na np 0, 0, 45 to przesuwa się do przodu pod kątem.
Dodatkowo chcę zrobić to tak, że przedmiot jest załóżmy w punkcie 0,0,0, tworzę jakiś wektor, który przesuwa go do przodu o (xF, yF, zF), czyli jeśli na xF podam 5 to przesuwam się do przodu o 5, a jak 5 zmienię na 0 to obiekt wróci to stanu wyjściowego, czyli punktu 0,0,0.

Kod: Zaznacz wszystko
    public GameObject obiekt; //mój obiekt, który ręcznie wrzucam do skryptu
    public float xF, yF, zF; //to są zmienne które chciałbym z poziomu edytora unity przesuwać obiektem


Próbowałem zastosować w funkcji Update, lecz nie działa to jak powinno:
Kod: Zaznacz wszystko
    obiekt.transform.localPosition = new Vector3(xF, yF, zF);
    obiekt.transform.position = new Vector3(xF, yF, zF);


Bo jeśli dobrze rozumiem tak powinienem się odnieść do osi współrzędnych obiektu a nie globalnych.
Jak powinienem to rozwiązać?
Znalazłem funkcję, która posuwa przedmiot do przodu, ale robi to w czasie ciągłym i trzeba by ją ograniczyć, tylko czy nie da się tego jakoś prościej?
Kod: Zaznacz wszystko
     obiekt.transform.Translate(new Vector3(xF, 0, 0));
Nikan
 
Posty: 4
Rejestracja: 05 Maj 2019, 21:41
Has thanked: 0 time
Been thanked: 0 time

Re: Poruszanie obiektem do przodu.

Postprzez Hostur » 22 Maj 2019, 18:57

przesuwanie obiektu realizuj normalnie po transform.position (tak wynika z Twojego opisu)

Kod: Zaznacz wszystko
[SerializeField][Range(0, 10)] private float _movementSpeed = 5;
private Vector3 _target;
public void MoveToPosition(Vector3 newPosition) => _target = newPosition;
private void Update() => transform.position = Vector3.Lerp(transform.position, _target, _movementSpeed * Time.deltaTime);


Co do ruszania w kierunku zwrotu
transform.position += transform.forward * _movementSpeed * Time.deltaTime;
Hostur
 
Posty: 707
Rejestracja: 05 Sie 2015, 07:36
Has thanked: 0 time
Been thanked: 0 time

Re: Poruszanie obiektem do przodu.

Postprzez WojciechX » 23 Maj 2019, 10:25

Vector3 ma 3 zmienne: x, y, z.
Wyobraź sobie, że masz wykres 1D czyli linia i jest tylko wartość x. Przesuwasz się dd lewej, do prawej po linii.
Wyobraź sobie, że masz wykres 2D czyli płaszczyzna i są wartości x oraz y. Przesuwasz się do lewej, do prawej, do góry, do dołu na płaszczyźnie.
Wyobraź sobie, że masz wykres 3D czyli przestrzeń jaką znasz i masz wszystkie 3 własności. Przesuwasz się do lewej, prawej czyli na boki - odpowiedzialny jest za to x. Przesuwasz się do góry, dołu i odpowiedzialny jest za to y. Przesuwasz się w głąb i z głębi, odpowiedzialny jest za to z.

Mając to wyobrażenie wiesz już, że z jest wektorem przesunięcia w przód i tył, x na boki.

Teraz musisz sobie ułożyć funkcję, która obróci Ci ten wektor, tak żeby pokrywał się z rotacją postaci:
Kod: Zaznacz wszystko
Vector3 direction = transform.rotation * new Vector3(xF, yF, zF);

Oczywiście możesz używać Vector3 w edytorze:
Kod: Zaznacz wszystko
[SerializeField]
private Vector3 f = Vector3.Zero, beginPosition = Vector3.Zero;

private void OnEnable()
{
beginPosition = transform.position;
}

private void Update()
{
Vector3 direction = transform.rotation * f;
transform.position = beginPosition + direction;
}

Begin position wrzuciłem bo chciałeś, żeby obiekt miał statyczny punkt, wobec którego się przesuwa i może do niego wrócić.
Awatar użytkownika
WojciechX
 
Posty: 44
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 3 gości