我正在练习我的Unity编程,通过创建一个自上而下的射击游戏,就像Stardew Valley的“草原之王之旅”。当我上下看并射击时,我试图将子弹旋转90度,以便它面向正确的方向。然而,每当我旋转子弹时,当我面朝上时,它向左移动,当我面朝下时,它向右移动。没有任何旋转,它运行得很好。下面是我的代码:
public class BulletMovement : MonoBehaviour
{
public Vector2 moveDirection;
private GameObject player;
public int speed;
// Start is called before the first frame update
void Start()
{
player = GameObject.Find("Player");
Move();
}
// Update is called once per frame
void Update()
{
transform.Translate(moveDirection * Time.deltaTime * speed);
CheckIfOutOfBounds();
}
//Moves the bullet in the direction the player is facing when the bullet is fired
private void Move()
{
if (player.GetComponent<PlayerMovement>().GetPlayerFacing().Equals("up"))
{
RotateBullet(90);
moveDirection = new Vector2(0, 1);
}
if (player.GetComponent<PlayerMovement>().GetPlayerFacing().Equals("down"))
{
RotateBullet(90);
moveDirection = new Vector2(0, -1);
}
if (player.GetComponent<PlayerMovement>().GetPlayerFacing().Equals("left"))
{
//Moves the bullet in front of the gun
transform.Translate(-0.363f, 0, 0);
moveDirection = new Vector2(-1, 0);
}
if (player.GetComponent<PlayerMovement>().GetPlayerFacing().Equals("right"))
{
//Moves the bullet in front of the gun
transform.Translate(0.363f, 0, 0);
moveDirection = new Vector2(1, 0);
}
}
//Destroys the bullet if it goes off-screen
private void CheckIfOutOfBounds()
{
if (transform.position.x is > 10 or < -10)
{
Destroy(gameObject);
}
if (transform.position.y is > 10 or < -10)
{
Destroy(gameObject);
}
}
private void RotateBullet(int degrees)
{
transform.rotation = Quaternion.Euler(new Vector3(0, 0, degrees));
}
}
尝试:
transform.Rotate(Vector 3(0,0,90))transform.Rotate(Vector3.right))transform.rotation = Quaternion.Euler(new Vector 3(0,0,degrees)); ->当前使用
1条答案
按热度按时间omqzjyyz1#
就像Buggarten提到的,这有点不正统,而且步骤比需要的多,但是。
以下是你如何在真实的生活中测试这一点:
看着你的显示器然后向左走。
这是
moveDirection = new Vector2(-1, 0);
现在看着你的显示器,把你的身体向左转90度,然后向前走。
也就是
RotateBullet(90);
和moveDirection = new Vector2(0,1);
不同,但相同。
希望这有帮助
编辑:
我还建议在脚本中设置播放器,而不是通过在子弹脚本中使用gameobject.find()来示例化子弹,并将播放器更改为类型PlayerMovement而不是GameObject,这样你就不会经常调用getcomponent。
你不必担心这个项目的性能,但它会养成良好的习惯,永远不要使用gameobject.find()
编辑2(关于评论):
在你的脚本中,玩家射击,你生成一个子弹,我假设你正在做类似
Instantiate(bulletPrefab,...);
的事情,您可以执行以下操作:
你也可以设置更多的东西,而不是回调到播放器,例如,你可以在这里设置movedirection,而不是使用GetPlayerFacing,那么你甚至不需要引用播放器。
对于我的解决方案,我通常有它,所以子弹脚本只是处理它自己的运动和它遇到的东西。我示例化它,给予它一个方向,它自己。