子对象未在父对象上实例化

时间:2019-02-25 15:57:00

标签: c# unity3d vector

我很难掌握Unity中的职位概念。

具有父对象(播放器)。在那个播放器上,我有一个名为“ 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 :(得分:2)

您想根据枪的朝向将子弹定位到相对偏移,对吗?如果按照现在的方式设置位置,则可以在与枪口无关的世界位置上进行设置。

现在,有两种方法可以实现:

将子弹放置在枪支的子对象上,并放置在相对的 local 位置,并立即使其脱离父级。这不是一个很好的解决方案,更像一个hack。

或使用我创建的以下方法:

/// <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方法,提供主炮的“变换”作为参数,并提供Vector3参数的相对偏移。示例:

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

这会将'item'的位置放在相机前面4个单位距离,在右边1.5个单位距离。

提示:RelativePosition将为您提供最终的世界位置。这就是您用来获取想要的相对位置作为世界位置的方法。 RelativePositionZero将为您提供从Transform对象到给定Vector3位置的相对偏移。可以用来确定是在给定的Transform的上方,下方,上方还是下方,左侧还是右侧。

答案 1 :(得分:1)

  

感觉到我尝试过的偏移量是hack

我看不到任何偏移..您可以这样做

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.uptransform.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);

不希望将其作为子代生成...因为如果您随后移动或旋转,子弹也会一起移动和旋转!

答案 2 :(得分:1)

问题是我实例化子弹上的子画面的偏移位置,而不是相对于实际游戏对象的0,0,0。