我很难掌握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;
}
答案 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.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);
您不希望将其作为子代生成...因为如果您随后移动或旋转,子弹也会一起移动和旋转!
答案 2 :(得分:1)
问题是我实例化子弹上的子画面的偏移位置,而不是相对于实际游戏对象的0,0,0。