我正在尝试学习Unity。我的目标是建立一个小行星克隆。
目前,我的角色能够飞翔,射击并向鼠标位置旋转。但是,子弹在某种程度上受玩家转身的影响。
以下是一些示例代码:
player.cs
private void Shoot()
{
Instantiate(Bullet, transform);
}
private void FaceMouseDirection()
{
Vector2 direction = Camera.main.ScreenToWorldPoint(Input.mousePosition) - transform.position;
float angle = Mathf.Atan2(direction.x, direction.y) * Mathf.Rad2Deg;
Quaternion rotation = Quaternion.AngleAxis(angle, Vector3.back);
transform.rotation = Quaternion.Slerp(transform.rotation, rotation, turningSpeed * Time.deltaTime);
}
bullet.cs
private GameObject parent;
private Vector3 Force;
// Use this for initialization
void Start ()
{
parent = GameObject.Find("Player");
Force = parent.transform.up * bulletSpeed;
}
void FixedUpdate()
{
transform.Translate(Force * Time.fixedDeltaTime);
}
}
答案 0 :(得分:3)
项目符号被设置为玩家的子代。子对象与父对象保持相同的旋转度。
在子弹的Start()
中,您需要在设置力后从子弹中删除父项。
我应该可以做到这一点
transform.parent = null;
答案 1 :(得分:1)
首先,不要让子弹成为玩家的孩子。 (不要使用Instantiate(Bullet, transform);
)
第二,将子弹实例化时,将子弹的旋转和位置设置为与玩家相同。 (请使用Instantiate(Bullet, transform.position, transform.rotation);
)
第三,不要将子弹的移动基于玩家的变形。只需使用自己的变换即可。 (请使用Force = transform.up * bulletSpeed;
代替Force = parent.transform.up * bulletSpeed
)
player.cs
private void Shoot()
{
GameObject bullet = Instantiate(Bullet, transform.position, transform.rotation);
}
private void FaceMouseDirection()
{
Vector2 direction = Camera.main.ScreenToWorldPoint(Input.mousePosition) - transform.position;
float angle = Mathf.Atan2(direction.x, direction.y) * Mathf.Rad2Deg;
Quaternion rotation = Quaternion.AngleAxis(angle, Vector3.back);
transform.rotation = Quaternion.Slerp(transform.rotation, rotation, turningSpeed * Time.deltaTime);
}
bullet.cs
private Vector3 Force;
// Use this for initialization
void Start ()
{
Force = -transform.right * bulletSpeed;
}
void FixedUpdate()
{
transform.Translate(Force * Time.fixedDeltaTime);
}
}
第四,您应该考虑对子弹使用一种称为object pooling的技术,因为实例化并销毁许多近乎重复的游戏对象通常效率不高。
注意:如果在子弹上使用Rigidbody
或Rigidbody2D
,则应使用rb.MovePosition(transform.position + Force * Time.deltaTime);
(Time.deltaTime
与{ Time.fixedDeltaTime
),因为它将正确插入在调用FixedUpdate
之间渲染的帧。
答案 2 :(得分:0)
这可能是因为您将项目符号实例化为对象转换的子级。 然后,当物体旋转时,子弹也会旋转。
您想在世界/根目录中实例化它们,或者如果要在层次结构中将它们分组,则可以在(0,0,0)的静态对象中实例化。
Object.Instantiate(bullet).transform.position = base.transform.position