Unity: остановка персонажа, идущего в гору (Углы между последней позицией и текущей позицией ?!) - PullRequest
0 голосов
/ 09 мая 2018

В настоящее время я работаю над небольшой игрой в Unity, и я использую c # для своего кода.

Игра представляет собой небольшую ролевую игру, в которой вы управляете персонажем, как в играх, таких как world of warcraft или age of dragon.

Вы бегаете по маленьким картам с холмами вокруг карты.В настоящее время вы можете ходить по холмам в некоторых местах, и я хочу это остановить.

поэтому я подумал, что напишу код, в котором я получу последнюю позицию моего персонажа и текущую позицию, затем получу угол между ними, и если угол слишком велик, я заставлю игрока вернуться назад(или отключить движение вперед).

это то, что я получил за код до сих пор:

Vector3 lastPos; // last Position
Vector3 curPos; // current Position
float slopeAngle; // The angle between curPos and lastPos

void Start()
{
    curPos = transform.position;
}

void FixedUpdate()
{
    lastPos = curPos;
    curPos = transform.position;
    slopeAngle = Vector3.Angle(lastPos, curPos);
}

к сожалению, slopeAngle в основном находится между 0 и 0,04.не имеет значения, бегу я по крутой горе или просто по плоскому холму

есть идеи ?!(если есть лучшее решение, чем получение угла между двумя точками, я очень заинтересован !!):)

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 10 мая 2018

Вы можете попробовать использовать Raycast от вашего персонажа, чтобы проверить, достаточно ли велик уклон, чтобы остановить ваше движение.

float maxSlopeAngle;
Transform raycastOrigin;

void FixedUpdate()
{
    RaycastHit hit;
    Vector3 direction = Quaternion.Euler(-MaxSlopeAngle, 0, 0) * transform.forward;
    if (Physics.Raycast(raycastOrigin.position, direction, out hit, 1f))
    {
         Debug.Log("Slope ahead!");
    }   
}

Очевидно, вы захотите определить правильное максимальное расстояние для радиопередачи, чтобы не останавливаться слишком рано.

Кроме того, вы можете использовать следующий скрипт для определения правильного угла:

[ExecuteInEditMode]
public class SlopeAngleHelper : MonoBehaviour {

    public float MaxSlopeAngle;
    public Transform RayOrigin;

    void Update () 
    {
        Vector3 direction = Quaternion.Euler(-MaxSlopeAngle, 0, 0) * transform.forward;
        Debug.DrawRay(RayOrigin.position, transform.forward, Color.black, 0.01f, false);
        Debug.DrawRay(RayOrigin.position, direction, Color.red, 0.01f, false);
    }
}

Просто наденьте его на объект вашего персонажа, и он "визуализирует" лучевую трансляцию при просмотре сцены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...