Огнестрельный снаряд по координатам целей - PullRequest
0 голосов
/ 12 мая 2019

Цель:

Я создаю шокер-шутер, шутер порождает шайбу каждые 3 секунды и запускает ее в целевой точке в пределах области стрельбы по цели;область для стрельбы - это плоскость, проходящая через лицо цели, которая действует как область для стрельбы, поскольку не все выстрелы будут в сети - шайба-шайба генерирует случайную точку в пределах этой области, что и позволяет получить цели X, Y & Z.

Я рассмотрел различные способы перемещения объекта, такие как transform.forward, transform.up и т. Д., Но я думаю, что я ищу, это puckRB.MovePosition?

Насколько я понимаю, при значении Is Is Kinematic метод MovePosition добавляет физику шайбе при ее перемещении по среде, в противном случае он просто телепортируется.Я просто не уверен, как поместить координаты целей в него с другими вещами, которые ему нужны?

void GetTarget()
{
    float scale = 1f;

    // Grabs the aiming plane
    Transform aimingPlane = GameObject.Find("AimingPlane").gameObject.transform.GetChild(1);

    // Gets the moving X & Y area of the plane
    float moveAreaX = aimingPlane.GetComponent<Renderer>().bounds.size.x / 2;
    float moveAreaY = aimingPlane.GetComponent<Renderer>().bounds.size.y / 2;

    // Generates a random value within the move area (X, Y)
    float ranX = Random.Range(-moveAreaX * scale, moveAreaX * scale);
    float ranY = Random.Range(-moveAreaY * scale, moveAreaY * scale);

    // Grabs the center of the AimingPlane
    Vector3 center = aimingPlane.GetComponent<Renderer>().bounds.center;

    // Gets the targets coordinates (X and Y)
    targetCoordsX = ranX + center.x;
    targetCoordsY = ranY + center.y;

    // Grabs AimingDot and places at target coordinates
    Transform aimingDot = GameObject.Find("AimingPlane").gameObject.transform.GetChild(0);
    aimingDot.position = new Vector3(targetCoordsX, targetCoordsY, center.z);
}


void FirePuck()
{
    GameObject puckCopy = Instantiate(puck, shotPos.transform.position, shotPos.transform.rotation) as GameObject;

    puckRB = puckCopy.GetComponent<Rigidbody>();

    Vector3 test = new Vector3(targetCoordsX, targetCoordsY);
    puckRB.MovePosition(test * Time.deltaTime);
}

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

1 Ответ

0 голосов
/ 13 мая 2019

Все Rigidbody.MovePosition мгновенно перемещает тело в новую позицию (телепортируется).

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

Вы хотите отключить IsKinematic и установить скорость (скорость) шайб:

puckRB.velocity = (destinationPos - currentPosition).normalized * speed;

Вычитание текущей позиции шайб из позиции назначения дает нам вектор направления. .normalized * speed превратит это в единичный вектор (вектор с величиной 1 и умножит на желаемую скорость движения).

public float puckSpeed = 1f;

void FirePuck()
{
    GameObject puckCopy = Instantiate(puck, shotPos.transform.position, shotPos.transform.rotation) as GameObject;

    puckRB = puckCopy.GetComponent<Rigidbody>();

    puckRB.velocity = (new Vector3(targetCoordsX, targetCoordsY, targetCoordsZ) - puckRB.transform.position).normalized * puckSpeed;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...