【发布时间】:2019-07-20 22:44:40
【问题描述】:
问题
我正在制作一个 2D Unity 游戏,你的角色的主要武器是火球枪。这个想法是火球会以玩家手指向的相同角度从玩家手中射出。我有 3 个问题:
-
当我发射火球时,由于火球是一个 RididBody,它会推动玩家。这是因为我已经将玩家手臂的中心(火球发射的地方)设为手臂围绕玩家旋转的点(即肩膀);
-
要在手臂上实例化火球预制件,我知道如何做到这一点的唯一方法是使用一段代码,该代码要求手臂是刚体。这意味着手臂受重力影响并在开始时从玩家身上掉下来,除非我冻结手臂的 y 轴运动,这意味着当玩家跳跃时,手臂没有下落,它漂浮在与沿 x 轴移动时开始的位置;和
-
火球射出时,射出后的推进角度与玩家手臂的角度不同。
实例化火球
if (Input.GetKeyDown(KeyCode.Space))
{
pew.Play();
var fireballTransform = Instantiate(fireballPrefab); //creates a new shot sprite
fireballTransform.position = new Vector3(transform.position.x + horizMultiplier, transform.position.y, transform.position.z);
fireballTransform.rotation = orientation;
fireballTransform.transform.Rotate(0, 0, transform.rotation.z);
}
if (Input.GetKeyDown(KeyCode.D)) // moves right
{
orientation = 0;
horizMultiplier = 0.08F;
}
if (Input.GetKeyDown(KeyCode.A)) // moves left
{
orientation = 180;
horizMultiplier = -0.08F;
}
这段代码位于应用于玩家手臂的脚本中。手臂的运动很好,问题似乎出在这段代码或我的火球代码中(我将在下一个)。一些定义:
-
pew是发射火球时播放的音效;
-
horizMultiplier 是我希望火球实例化的距手臂中心的距离(也取决于玩家是面向左侧还是面向右侧);和
-
orientation 是玩家面向的方向(左或右)。然后将火球实例化为面向同一方向。
火球脚本
public Vector2 speed = new Vector2(); // x and y forces respectively
private Rigidbody2D rb; // shorthand
private float rotation;
void Start()
{
rb = GetComponent<Rigidbody2D>(); // shorthand
rotation = rb.rotation;
if (rotation == 0)
{
rb.AddForce(Vector3.right * speed.x); // propels right
}
if (rotation == 180)
{
rb.AddForce(Vector3.left * speed.x); // propels left
}
}
我相信这段代码对于 cmets 来说已经足够解释了(如果没有,请发表评论,我会解决任何问题)。我相信这段代码中也可能存在问题,因为以下几行:rb.AddForce(Vector3.right * speed.x); 和rb.AddForce(Vector3.left * speed.x); 因为它们向对象添加了方向力。我不知道这是客观方向(无论施加力的对象朝向哪个方向,都是向右还是向左),或者就对象而言它是向右还是向左——比如一个对象是否旋转了 90 度顺时针方向,该物体施加了一个力,使其向右移动,使该物体向下移动。
我期望发生的是玩家的手臂会转动,这样当火球被发射时,它会朝手臂所面对的方向发射。武器转动机制很好,它只是试图正确地实例化火球。任何人都可以帮助解决我提出的任何问题吗?
【问题讨论】: