Дочерний объект не создается на родительском объекте - PullRequest
0 голосов
/ 25 февраля 2019

Мне трудно понять концепцию положения в Unity.

Есть родительский объект (Player).На этом плеере у меня есть дочерний объект под названием «Gun».На пистолете у меня есть скрипт для стрельбы пулями.Когда я стреляю пулями, он появляется слева от оружия и игрока.

Я пытался сместить позицию пули при появлении, но когда я оборачиваюсь, локация неверна (она все еще непо центру на пистолет).У меня также есть ощущение, что смещение, которое я пробовал, является хаком, и что-то где-то пропустил.

Мой код для скрипта стрельбы на пистолете:

void Update()
{
    if (Input.GetAxisRaw("Fire1") > 0)
    {
        var pos = transform.position;
        print(pos.ToString());
        var proj = Instantiate(projectile, pos, Quaternion.identity);

        proj.transform.rotation = transform.rotation;

    }
}

Единственное, что касается пули, это мой BulletController, скрипт на пули:

void Start()
{
    rb = GetComponent<Rigidbody2D>();
    //rb.AddForce(transform.forward * 100, ForceMode.Impulse);
    rb.velocity = transform.up * 10;

}

Прикрепленный скриншот моей установки enter image description here

Ответы [ 3 ]

0 голосов
/ 25 февраля 2019

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

Теперь есть два способа сделать это:

Поместитеbullet в качестве дочернего объекта пистолета с относительной локальной позицией и сразу же не заполняет его.Не очень хорошее решение и больше похоже на взлом.

Или используйте следующие методы, которые я создал:

/// <summary> Returns a vector which is relative to the facing and position of 'c'. </summary>
public static Vector3 RelativePosition (Transform c, Vector3 target)
{
    return c.right * target.x + c.up * target.y + c.forward * target.z + c.position;
}

/// <summary> Returns a vector which is relative. </summary>
public static Vector3 RelativePosition (Vector3 position, Vector3 forward, Vector3 up, Vector3 right, Vector3 target)
{
    return right * target.x + up * target.y + forward * target.z + position;
}

И дополняйте это:

/// <summary> Returns a vector which is relative to the facing of 'c'. </summary>
public static Vector3 RelativePositionZero (Transform c, Vector3 target)
{
    return c.right * target.x + c.up * target.y + c.forward * target.z;
}

/// <summary> Returns a vector which is relative. </summary>
public static Vector3 RelativePositionZero (Vector3 forward, Vector3 up, Vector3 right, Vector3 target)
{
    return right * target.x + up * target.y + forward * target.z;
}

Использование:Используйте метод RelativePosition, предоставьте Transform для пистолета в качестве параметра и относительное смещение для параметра Vector3.Пример:

        item.position = RelativePosition (Camera.Main.transform, new Vector3 (1.5f, 0f, 4.0f));

Это поместило бы позицию 'item' на 4 единицы расстояния перед камерой и на 1,5 единицы расстояния вправо.

Подсказка: RelativePosition даст вам результатмировое положение как таковое.Это то, что вы используете, чтобы получить относительную позицию, которую вы ищете в качестве мировой позиции.RelativePositionZero даст вам относительное смещение от объекта Transform к заданной позиции Vector3.Это может быть использовано для определения, находится ли что-то левое или правое, выше или ниже, впереди или позади данного преобразования.

0 голосов
/ 26 февраля 2019

Проблема заключалась в том, что я создал экземпляр спрайта для пуль со смещением, а не 0,0,0 относительно реального объекта игры.

0 голосов
/ 25 февраля 2019

ощущение, что смещение, которое я пробовал, является хаком

Я не вижу смещения ... вы можете сделать, например,

public float offset = 0.5f;


if (Input.GetAxisRaw("Fire1") > 0)
{
    // add the offset here
    var pos = transform.position + transform.up * offset;
    print(pos.ToString());

    var proj = Instantiate(projectile, pos, Quaternion.identity);

    proj.transform.rotation = transform.rotation;
}

transform.position порождает пулю в том же месте, что и пистолет.Я добавил transform.up, поскольку кажется, что это направление, в котором смотрит ваш игрок (в 3D-пространстве это будет, например, transform.forward, но в 2D это будет либо transform.up, либо transform.right в зависимости от того, в каком направлении игрок смотрит по умолчанию.).offset - это то, насколько далеко вы хотите поместить пулю в заданном направлении в метрах / единицах.


Если вы предпочитаете смещение Vector3 для большего контроля / для отладки, какая ось правильная, вы могли бы вместо этого использовать

public Vector3 offset;

//...

var proj = Instantiate(projectile, transform.position, Quaternion.identity);

proj.transform.rotation = transform.rotation;

// Now move it to the offset in local space
proj.transform.Translate(offset, Space.Self);

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

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