【问题标题】:Instantiate a prefab pointing in the direction of another object实例化指向另一个对象方向的预制件
【发布时间】:2019-07-20 22:44:40
【问题描述】:

问题

我正在制作一个 2D Unity 游戏,你的角色的主要武器是火球枪。这个想法是火球会以玩家手指向的相同角度从玩家手中射出。我有 3 个问题:

  1. 当我发射火球时,由于火球是一个 RididBody,它会推动玩家。这是因为我已经将玩家手臂的中心(火球发射的地方)设为手臂围绕玩家旋转的点(即肩膀);

  2. 要在手臂上实例化火球预制件,我知道如何做到这一点的唯一方法是使用一段代码,该代码要求手臂是刚体。这意味着手臂受重力影响并在开始时从玩家身上掉下来,除非我冻结手臂的 y 轴运动,这意味着当玩家跳跃时,手臂没有下落,它漂浮在与沿 x 轴移动时开始的位置;和

  3. 火球射出时,射出后的推进角度与玩家手臂的角度不同。

实例化火球

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 度顺时针方向,该物体施加了一个力,使其向右移动,使该物体向下移动。

我期望发生的是玩家的手臂会转动,这样当火球被发射时,它会朝手臂所面对的方向发射。武器转动机制很好,它只是试图正确地实例化火球。任何人都可以帮助解决我提出的任何问题吗?

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    我会怎么做:

    1. 添加一个空变换作为手臂的子项,并将其移动到应该产生火球的位置。还要确保它的旋转使得它的前向矢量(局部 z 轴)指向火球应该去的地方。要看到这一点,您需要在播放按钮的左侧设置“本地”。
    2. 在旋转的变换位置生成火球。
    3. 使用https://docs.unity3d.com/ScriptReference/Physics.IgnoreCollision.html 忽略手臂/玩家的碰撞器与火球的碰撞器之间的碰撞。如有必要,您可以在 1s 左右后再次启用两个碰撞器之间的碰撞。
    4. 将火球刚体的速度设置为 speed * 刚体.forward。

    如果您需要代码方面的帮助,请将其发布,以便我查看发生了什么。

    编辑:

    1. 手臂绝对不需要刚体。
    2. 您可以只使用 Instantiate(prefab, position, rotation) 作为速记。
    3. 这是用于 2D 游戏的吗?

    另外,我现在要睡觉了,但我很乐意明天帮忙。

    【讨论】:

      【解决方案2】:

      您的问题

      1) 您应该遮盖火球的图层以免与玩家的图层发生碰撞。
      你可以在这里找到更多信息:https://docs.unity3d.com/Manual/LayerBasedCollision.html
      (注意:确保您在 Physics2D 面板上,而不是 Physics 面板上,因为那是 3D)

      2) 在RigidBody2D 中有一个名为gravityScale 的设置。如果您不希望重力影响您的对象,则应将其设置为 0。更多信息:https://docs.unity3d.com/Manual/class-Rigidbody2D.html

      火球实例化

      if (Input.GetKeyDown(KeyCode.Space))
          {
              pew.Play();
      
              var position = hand.transform.position + hand.transform.forward * horizMultiplier;
              var rotation = hand.transform.rotation;
      
              var fireball = Instantiate<Fireball>(fireballPrefab, position, rotation);   
              fireball.StartMoving();
          }
      
      

      火球脚本

      private Rigidbody2D rb;                 // shorthand
      private float rotation;
      
      public float Speed;
      
      public void StartMoving()
          {
              rb = GetComponent<Rigidbody2D>();           // shorthand
              rb.velocity = transform.forward * Speed;
          }
      
      void OnTriggerEnter(....) { .... }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-17
        • 1970-01-01
        • 2020-02-20
        相关资源
        最近更新 更多