【问题标题】:Unity Bullet Doesnt WorkUnity 子弹不起作用
【发布时间】:2015-12-10 04:25:29
【问题描述】:
using UnityEngine;
using System.Collections;

public class AIEnemy : MonoBehaviour {
   public GameObject bullet;
  public float bulletSpeed = 10;

  public Transform player;

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void FixedUpdate () {


    }
 void OnTriggerStay2D(Collider2D col)
    {
        if(col.tag == "Player")
       {
           // Debug.DrawRay(transform.position, player.position - transform.position);
          RaycastHit2D rhit2d = Physics2D.Raycast(transform.position, player.position - transform.position, Mathf.Infinity);
          if (rhit2d.collider.tag == "Player")
            {
             var clone = Instantiate(bullet, transform.position, Quaternion.identity) as Rigidbody2D;
            clone.velocity = (player.position - transform.position * bulletSpeed);
          }
        }
    }
}

这是我的代码。当玩家停留在触发对撞机中时,它会找到玩家并向其开火。但我的问题是子弹不会射向玩家,它只是掉下来。我已将子弹设置为触发器,所以这不是问题。 (顺便说一句,这是一个 2D 游戏)该项目在 Github 上:https://github.com/Massaxe/2D-AI/

【问题讨论】:

    标签: c# unity3d 2d


    【解决方案1】:

    我马上看到的一个问题与bulletGameObject 类型有关。我将假设这个GameObject 参考是您构建并链接到AIEnemy 实例的预制件。这里要注意的关键是GameObject 通常充当一对多Component 实例的容器,Rigidbody2D 本身就是一个。以下代码是我用来访问Rigidbody2D 组件的代码:

    var clone = Instantiate(bullet, transform.position, Quaternion.identity) as GameObject;
    var rigidBody = clone.GetComponent<Rigidbody2D>();
    rigidBody.velocity = (player.position - transform.position * bulletSpeed);
    

    至于数学,我会这样计算速度:

    var vel = player.position - transform.position;
    vel.Normalize();
    vel *= bulletSpeed;
    rigidBody.velocity = vel;
    

    它的作用是计算两个位置之间的向量,但是,在应用子弹速度之前,它将向量标准化(意味着向量的大小为 1,但保持适当的方向)。然后,将子弹速度应用于归一化向量。

    为了进一步扩展这一点,我想指出,如果子弹是自行下落的,则很可能会在子弹上施加 2D 引力,这可能是也可能不是您要寻找的东西.另外,阻力系数也要检查一下,好像它是任何大于0的值,随着时间的推移会导致子弹减速(认为它是摩擦)。

    【讨论】:

    • Instantiate(...) 因为 Rigidbody2D 应该返回组件而不是游戏对象,所以这可能不是问题。基本上这里的“克隆”已经是 Rigidbody2D
    • Instantiate(...) 方法创建第一个参数的克隆,在本例中为项目符号变量。此变量的类型为 GameObject。 Rigidbody2D 派生 Component,后者派生 Object。 Rigidbody2D 绝不会派生 GameObject。话虽如此,由于 Instantiate 正在克隆子弹变量,而子弹变量是一个游戏对象,所以它不可能返回一个 Rigidbody2D。 “as GameObject”代码只是将 Instantiate 调用的结果转换为所需类型的 C# 语法,如果转换失败则返回“null”。
    • 我的错,你是绝对正确的,但我建议将子弹预制件作为 Rigidbody2D 然后防止所有铸造
    • 好建议汤姆!我的想法是,应该选择并在大多数情况下遵循约定。例如,在我的项目中,我有一个约定,所有预制件引用都将链接为 GameObject 实例。这只是让我更容易区分什么是我可以实例化的预制件,什么是在运行时链接的非预制组件。最后,这是一个见仁见智的问题,但无论哪种方式的约定都将有助于可维护性并防止愚蠢的错误。
    • 谢谢大家,我稍后再试试
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-04
    • 1970-01-01
    相关资源
    最近更新 更多