最近在制作一款游戏,在这个武器及子弹旋转问题上有了点停留,在多方思考下决定使用了这个实现方法来完成这部分的制作。
武器旋转
在武器旋转上我采用随着鼠标即时旋转的方法实现,代码如下:
private void arm_rotate()
{
if (equipment != null)
{
GameObject maincamera = GameObject.FindGameObjectWithTag("MainCamera");
Vector2 mouseposition;
mouseposition = maincamera.GetComponent<Camera>().ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 10f));
Vector2 direction = new Vector2(mouseposition.x - GetComponent<Transform>().position.x, mouseposition.y - GetComponent<Transform>().position.y);
float angle = Vector2.Angle(direction, Vector2.right);
if (mouseposition.y < this.transform.position.y)
angle = -angle;
equipment.GetComponent<Transform>().eulerAngles = new Vector3(0, 0, angle);
}
}
equipment是先前定义过的GameObject对象,用来引用武器游戏对象。先用FindGameObjectWithTag方法寻找到主摄像机(也可以先public一个游戏物体,再在unity界面拖入对应的摄像机),再调用ScreenToWorldPoint方法来把鼠标的点转换为世界坐标。通过direction来记录方向,再用Vector2.Angle方法来计算旋转的夹角(需要注意的是再鼠标y轴小于物体时夹角应该为相反值)。最后通过Transform.eulerAngles方法旋转即可。
子弹旋转
在武器旋转上我采用随着鼠标即时旋转的方法实现,代码如下:
private void player_attack()
{
GameObject player_launcher;
GameObject maincamera = GameObject.FindGameObjectWithTag("MainCamera");
Vector2 mouseposition;
mouseposition = maincamera.GetComponent<Camera>().ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 10f));
Vector2 direction = new Vector2(mouseposition.x - GetComponent<Transform>().position.x, mouseposition.y - GetComponent<Transform>().position.y);
float angle = Vector2.Angle(direction, Vector2.right);
if (mouseposition.y < this.transform.position.y)
angle = -angle;
player_launcher = Instantiate(_launcher, GameObject.FindGameObjectWithTag("shoot_point").transform.position, Quaternion.identity);
player_launcher.GetComponent<Transform>().eulerAngles = new Vector3(0, 0, angle);
}
子弹的旋转大体也和上面的原理相同,注意角度的选择方向和取相反值的判断条件即可。