Zefirot
@Zefirot

Как не дать коллайдеру внутри объекта проникнуть в другой коллайдер?

Проблема изначально заключалась в том что объект с CharacterController (без RigidBody) при медленном спуске с обрыва висел в воздухе
635ce7298cfd4343748115.jpeg
Много чего перепробовал, но всё в различных ситуациях давало баги, единственно лучшим решением стало уменьшить радиус контроллера до 0.05, это решило проблему с зависанием в воздухе, но породило новую проблему, проваливание в стены из-за того что контроллер теперь малого радиуса.
мне пришло в голову такая идея - расположить в объекте еще один сферический к примеру объект коллайдер и чтобы он не давал проваливаться в другие объекты, то есть дополнительный коллайдер, но он не реагирует, даже если ему дать твёрдое тело
635ce8cd37ab6419543421.png
В общем тут и стал вопрос - как не дать коллайдеру внутри объекта проникнуть в другой коллайдер?
Подскажите что можно сделать в данной ситуации?
  • Вопрос задан
  • 133 просмотра
Решения вопроса 1
@Ezekiel4
Охотник на пиратов и сборщик монолитов
Сам по себе CharacterController имеет внутренний капсуль-коллайдер, который так-то не должен застревать внутри других объектов. Такое может происходить в случае неправильного использования (скрипты). Например, толкать персонажа внутрь коллайдера со слишком большой силой. Сделай вы так со стандартной связкой коллайдера и твёрдого тела, последний бы просто улетел от накопившихся внутренних напряжений. CharacterController же, в свою очередь, не то чтобы сдвинуть, даже телепортировать извне никак нельзя без его отключения.

Также такой баг теоретически может возникнуть при движении с использованием свойства velocity, словно это rigidbody. Если вы вдруг так делайте - используйте метод Move(Vector3).

Кроме того, ваш контроллер сам по себе не знаком с гравитацией. Есть также ненулевая вероятность, что стоя краешком на обрыве персонаж всё ещё считает себя стоящим на земле, и у вас не срабатывает код гравитации (если он вообще есть).

В любом случае, для более квалифицированой помощи рекомендую приложить скриншот, содержащий настройки персонажа и раскрытый вид иерархии персонажа, а также код движения.

Примерно вот так выглядит обычный скрипт персонажа с таким контроллером:
скрипт

using UnityEngine;

[RequireComponent(typeof(CharacterController))]
public class PlayerMove3D : MonoBehaviour {

	CharacterController controller;

	Vector3 input, velocity;

	public float moveSpeed = 10f;
	public float jumpPower = 10f;
	public float gravity = 20f;

	public Transform groundCheckPoint;
	public float groundCheckRadius;
	public LayerMask groundLayer;

	private void Start() => controller = GetComponent<CharacterController>();

	private void Update() {
		input.x = Input.GetAxis("Horizontal");
		input.z = Input.GetAxis("Vertical");
		input = input.normalized;

		bool grounded = Physics.CheckSphere(groundCheckPoint.position, groundCheckRadius, groundLayer);

		if (grounded && velocity.y < 0)
			velocity.y = -2f;

		if (Input.GetKeyDown(KeyCode.Space) && grounded) {
			Jump(Mathf.Sqrt(2f * gravity * jumpPower));
		}
	}

	private void FixedUpdate() {
		Vector3 moveVector = transform.right * input.x + transform.forward * input.z;
		controller.Move(moveVector * moveSpeed * Time.fixedDeltaTime);

		velocity.y -= gravity * Time.fixedDeltaTime;
		controller.Move(velocity * Time.fixedDeltaTime);
	}

	private void OnControllerColliderHit(ControllerColliderHit hit) {
		// TODO collisions
	}
}

Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы