Obecnie pracuję nad ruchem mojej postaci w Unity3D . Udało mi się zmusić go do przesunięcia się względem kursora myszy. Ustawiłem granicę nachylenia 45 °, która nie pozwala postaci chodzić po górach z wyższymi stopniami. Ale wciąż może je podskoczyć.
Jak mogę sprawić, by znów zsunął się, gdy skakał w miejsca o zbyt dużym nachyleniu?
Z góry dziękuję.
edit: Fragment kodu mojego podstawowego ruchu. using UnityEngine; using System.Collections;
public class BasicMovement : MonoBehaviour {
private float speed;
private float jumpSpeed;
private float gravity;
private float slopeLimit;
private Vector3 moveDirection = Vector3.zero;
void Start()
{
PlayerSettings settings = GetComponent<PlayerSettings>();
speed = settings.GetSpeed();
jumpSpeed = settings.GetJumpSpeed();
gravity = settings.GetGravity();
slopeLimit = settings.GetSlopeLimit();
}
void Update() {
CharacterController controller = GetComponent<CharacterController>();
controller.slopeLimit = slopeLimit;
if (controller.isGrounded) {
moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
moveDirection = transform.TransformDirection(moveDirection);
moveDirection *= speed;
if (Input.GetButton("Jump")) {
moveDirection.y = jumpSpeed;
}
}
moveDirection.y -= gravity * Time.deltaTime;
controller.Move(moveDirection * Time.deltaTime);
}
}
Odpowiedzi:
Hamowanie po uderzeniu w ziemię jest nieprawidłowe, po prostu zatrzymujesz ruch pionowy, ale tak działa uderzenie w ziemię, gdy ziemia jest płaska.
Co powinieneś zrobić, to rzutować
moveDirection
na uderzoną powierzchnię, która da ci nowąmoveDirection
. Jeśli twoja biblioteka ma funkcję rzutowania wektora na płaszczyznę lub powierzchnię, to właśnie powinieneś użyć. Jeśli nie, należy odjąćmoveDirection
rzut na normalną powierzchnię odmoveDirection
siebie.źródło
po prostu sprawdź przed skokiem, czy postać stoi na ziemi, to znaczy, jeśli nie znajduje się na pochyłym zboczu. i wszystko inne pozostaw silnikowi fizyki.
na podstawie podanego przez ciebie kodu widzę, gdzie jest problem:
według Unity odniesienia skryptu ,
CharacterController.isGrounded
wraca tylko jeśli postać jest dotykania ziemi. nie sprawdza slopelimit. po krótkich poszukiwaniach FPSWalkerEnhanced wydaje się być czymś, co rozwiązuje problem.źródło