Столкновения с объектами

Программирование на Юнити.

Столкновения с объектами

Сообщение Sindunity 20 апр 2018, 17:03

Никак не могу сообразить. Каким образом сделать просчет столкновений с объектами игрового мира без включения физики. Есть игровой объект - Куб. Который двигается и одновременно вращается. Включение физических столкновений с миром означает нежелательное смещение по координатам. А задача ведь настолько простая: сделать так, чтобы куб не проходил сквозь другие объекты.
Вот скрипт движения куба (написанный, к сожалению, не мной)
Синтаксис:
Используется csharp
public class CubeMovement : MonoBehaviour {


    public float rotationPeriod = 0.3f;     // Время, необходимое для перехода на следующее место
    public float sideLength = 1f;           // Длина края куба

    bool isRotate = false;                  // Флаг для определения того, вращается ли куб или нет
    float directionX = 0;                   // Флаг направления вращения
    float directionZ = 0;                   // Флаг направления вращения

    Vector3 startPos;                       // Положение куба перед вращением
    float rotationTime = 0;                 // Временной интервал во время вращения
    float radius;                           // Орбитальный радиус центра тяжести
    Quaternion fromRotation;                // Центрирование перед вращением
    Quaternion toRotation;                  // Центрирование после вращения

    // Use this for initialization
    void Start()
    {

        // Рассчитать радиус орбиты центра тяжести
        radius = sideLength * Mathf.Sqrt(2f) / 2f;

    }

    // Update is called once per frame
    void Update()
    {
        // Ключи (управление)
        float x = 0;
        float y = 0;

       
        x = Input.GetAxisRaw("Horizontal");
        if (x == 0)
        {
            y = Input.GetAxisRaw("Vertical");
        }


        // Если есть ключевой ввод, и куб не вращается
        if ((x != 0 || y != 0) && !isRotate)
        {
            directionX = y;                                                             // Направление вращения (либо x, либо y должно быть 0)
            directionZ = x;                                                             // Направление вращения (либо x, либо y должно быть 0)
            startPos = transform.position;                                              // Ведение координат перед вращением
            fromRotation = transform.rotation;                                          // Держите кватернион перед вращением
            transform.Rotate(directionZ * 90, 0, directionX * 90, Space.World);     // Повернуть на 90 градусов в направлении вращения
            toRotation = transform.rotation;                                            // Сохранять кватернион после вращения
            transform.rotation = fromRotation;                                          // Вращение возвратного куба перед вращением
            rotationTime = 0;                                                           // Установите время, прошедшее во время вращения, в 0.
            isRotate = true;                                                            // Установите флаг поворота
        }
    }

    void FixedUpdate()
    {

        if (isRotate)
        {

            rotationTime += Time.fixedDeltaTime;                                    // Увеличить прошедшее время
            float ratio = Mathf.Lerp(0, 1, rotationTime / rotationPeriod);          // Процент текущего прошедшего времени относительно времени вращения

            // движение
            float thetaRad = Mathf.Lerp(0, Mathf.PI / 2f, ratio);                   // Угол поворота в радианах.
            float distanceX = -directionX * radius * (Mathf.Cos(45f * Mathf.Deg2Rad) - Mathf.Cos(45f * Mathf.Deg2Rad + thetaRad));      // Расстояние, пройденное по оси X. Знак - для выравнивания направления движения с ключом.
            float distanceY = radius * (Mathf.Sin(45f * Mathf.Deg2Rad + thetaRad) - Mathf.Sin(45f * Mathf.Deg2Rad));                        // Расстояние перемещения оси Y
            float distanceZ = directionZ * radius * (Mathf.Cos(45f * Mathf.Deg2Rad) - Mathf.Cos(45f * Mathf.Deg2Rad + thetaRad));           // Расстояние перемещения по оси Z
            transform.position = new Vector3(startPos.x + distanceX, startPos.y + distanceY, startPos.z + distanceZ);                       // Установите текущую позицию

            // вращение
            transform.rotation = Quaternion.Lerp(fromRotation, toRotation, ratio);      // Установите текущий угол поворота в Quaternion.Lerp (какая полезная функция)

            // Инициализируйте каждый параметр в конце движения/вращения. Опустите флаг isRotate.
            if (ratio == 1)
            {
                isRotate = false;
                directionX = 0;
                directionZ = 0;
                rotationTime = 0;
            }
        }
    }
}
 


Буду благодарен любой помощи.
Sindunity
UNец
 
Сообщения: 9
Зарегистрирован: 07 июн 2017, 13:43

Re: Столкновения с объектами

Сообщение 1max1 20 апр 2018, 17:27

Ну физику можно и не использовать лишь для просчета столкновения, вешаешь коллайдер + rigidbody(Kinematic) и отлавливаешь OnCollisionEnter.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Столкновения с объектами

Сообщение Sindunity 21 апр 2018, 16:39

Спасибо за ответ.
Буду очень благодарен, если вы подскажете как это лучше сделать в коде. Ибо у меня получается какая-то лажа
Sindunity
UNец
 
Сообщения: 9
Зарегистрирован: 07 июн 2017, 13:43


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: GoGo.Ru [Bot] и гости: 9