Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 统一子弹不起作用_C#_Unity3d_2d - Fatal编程技术网

C# 统一子弹不起作用

C# 统一子弹不起作用,c#,unity3d,2d,C#,Unity3d,2d,这是我的代码。当玩家停留在触发碰撞器中时,它会找到玩家并向其开火。但我的问题是子弹没有射向球员,而是掉了下来。我把子弹当作扳机,所以这不是问题所在。(顺便说一句,这是一个2D游戏)该项目在Github上:我马上看到的一个问题与子弹属于游戏对象类型有关。我将假设这个GameObject引用是您构建并链接到ai敌方实例的预设。这里需要注意的关键点是,GameObject通常充当一对多组件实例的容器,Rigidbody2D本身就是一个。以下代码是我用来访问Rigidbody2D组件的代码: using

这是我的代码。当玩家停留在触发碰撞器中时,它会找到玩家并向其开火。但我的问题是子弹没有射向球员,而是掉了下来。我把子弹当作扳机,所以这不是问题所在。(顺便说一句,这是一个2D游戏)该项目在Github上:

我马上看到的一个问题与
子弹
属于
游戏对象类型有关。我将假设这个
GameObject
引用是您构建并链接到
ai敌方
实例的预设。这里需要注意的关键点是,
GameObject
通常充当一对多
组件
实例的容器,
Rigidbody2D
本身就是一个。以下代码是我用来访问
Rigidbody2D
组件的代码:

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);
          }
        }
    }
}
这样做的目的是计算两个位置之间的矢量,但在应用子弹速度之前,它会将矢量规格化(这意味着,矢量的大小为1,但保持适当的方向)。然后,将子弹速度应用于归一化向量


为了进一步说明这一点,我想指出的是,如果子弹是自己落下的,那么很可能有一个2D引力作用在子弹上,这可能是你想要的,也可能不是你想要的。此外,还应检查阻力系数,因为如果它是任何大于0的值,它将导致子弹随时间减速(将其视为摩擦)

实例化(…)为Rigidbody2D应该返回组件而不是游戏对象,所以这可能不是问题所在。基本上,这里的“clone”已经是RigidBody2D了。实例化(…)方法创建第一个参数的克隆,在本例中是bullet变量。此变量的类型为GameObject。Rigidbody2D派生组件,该组件派生对象。Rigidbody2D在任何时候都不能派生游戏对象。也就是说,由于Instantiate正在克隆bullet变量,而bullet变量是一个游戏对象,因此它不可能返回Rigidbody2D。“as GameObject”代码仅仅是C#语法,它将实例化调用的结果强制转换为所需的类型,如果转换失败,则返回“null”。糟糕,你完全正确,但我建议将bullet预置作为Rigidbody2D,这样可以阻止所有强制转换好的建议Tom!我的想法是,大多数情况下都应该选择并遵循一个惯例。例如,在我的项目中,我有一个约定,所有预制引用都将作为游戏对象实例链接。这使得我更容易区分我可以实例化的预制组件和运行时链接的非预制组件。最后,这是一个意见的问题,但无论哪种方式的约定都将有助于维护性和防止愚蠢的错误。谢谢各位,我稍后会尝试
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;