我在游戏中使用gameobjects作为子弹,但我可能做得不好。我从我的枪管中投射光线,实例化对象并通过Transform.MoveTowards()将其移动到RaycastHit.point。问题是当我向敌人开枪时,它会在子弹到达之前移动,因为子弹永远漂浮在空中。我在那里看到两个解决方案:我可以检查子弹是否有问题,但我不知道如何为数百个子弹提供一个仅为OnCollisionEnter每帧完成的脚本是一个坏主意。第二种方法是每帧改变目标位置,但我不知道如何保存它。 我该怎么做?
public static List <GameObject> bullets = new List <GameObject> ();
public static List <Vector3> targets = new List <Vector3> ();
public override void Shot (Vector3 hitPoint) {
for (int i = 0; i < raysNumber; i++) {
direction = new Vector3 (UnityEngine.Random.Range (-splash, splash), UnityEngine.Random.Range (-splash, splash), 100);
direction = t_barrel.TransformDirection (direction);
if (Physics.Raycast (t_barrel.position, direction, out cele[i], 100, layer)) {
EnemyFPS enemyHealth = cele[i].collider.GetComponent <EnemyFPS> ();
bullets.Add (MonoBehaviour.Instantiate (g_kubik, t_barrel.position, t_barrel.rotation) as GameObject);
targets.Add (cele [i].point);
}
}
public override void MoveBullets () {
if (bullets.Count > 150) {
bullets.RemoveAt (0);
targets.RemoveAt (0);
}
for (int i = 0; i < bullets.Count; i++) {
bullets [i].transform.position = Vector3.MoveTowards (bullets [i].transform.position, targets [i] * 10, 1f);
}
}
每帧调用MoveBullets。
子弹:
Vector3 pro;
float speed = 10;
void Start () {
pro = transform.InverseTransformDirection (transform.forward);
}
void Update () {
transform.Translate (pro * speed * Time.deltaTime);
}
void OnTriggerEnter (Collider other) {
Debug.Log ("Collision");
EnemyFPS enemy = other.gameObject.GetComponent <EnemyFPS> ();
if (enemy != null) {
enemy.TakeDamage (5);
other.gameObject.transform.SetParent (other.transform);
}
GetComponent<Collider>().gameObject.GetComponent <Collider> ().enabled = false;
Destroy (gameObject.GetComponent <BulletS> ());
}
Shoting
t_barrel.LookAt (hitPoint);
MonoBehaviour.Instantiate (g_kubik, t_barrel.position, t_barrel.rotation);
答案 0 :(得分:1)
如果您完全遵循Unity3d太空射击教程,我相信您的所有疑问都将得到解决。这是它的link 我所理解的以及你基本上需要做的是为你的敌人添加一个对撞机,以便当子弹触及敌人时,会发生一些事情。就像,敌人死亡或受伤,当然子弹被摧毁,除非它是狙击步枪子弹,有时可以穿透头骨并杀死第一个敌人后面的另一个敌人,但这是更先进的。 或者,您可以限制每帧可以生成的项目符号数。
答案 1 :(得分:1)
您需要做的是在名为BulletScript
的{{1}}中添加一个字段,然后让子弹向一个方向射击。这就是为什么你的子弹达到了这一点并且无处可去。
direction
答案 2 :(得分:0)
以统一方式为敌人/目标设置标记。例如,让我们将敌方游戏对象的标记设置为&#34; EnemyObj&#34;。 然后,在项目符号代码中使用以下伪代码:
void OnTriggerEnter (Collider other) {
//Compare the tag of the Collider other object with "EnemyObj" using compare tag method
//If it is true then..
//Do something like decrease health
//Finally call Destroy (gameObject.GetComponent <BulletS> ());
}