Unity3d 在敌人越过对撞机后,如何停止自动炮塔的连续射击?
我有一个炮塔,作为一个游戏对象,当敌人进入它的碰撞箱时,炮塔开始向它开火,逻辑是当敌人退出碰撞机时,它应该停止射击,而另一个问题是,当敌人再次进入碰撞箱时,即第二个敌人,它给了我一个例外,MissingReferenceException:类型为“transform”的对象已销毁,但您仍在尝试访问它。您的脚本应检查它是否为null或不应销毁它,但我正在检查代码中的列表是否为null。这是我的代码Unity3d 在敌人越过对撞机后,如何停止自动炮塔的连续射击?,unity3d,Unity3d,我有一个炮塔,作为一个游戏对象,当敌人进入它的碰撞箱时,炮塔开始向它开火,逻辑是当敌人退出碰撞机时,它应该停止射击,而另一个问题是,当敌人再次进入碰撞箱时,即第二个敌人,它给了我一个例外,MissingReferenceException:类型为“transform”的对象已销毁,但您仍在尝试访问它。您的脚本应检查它是否为null或不应销毁它,但我正在检查代码中的列表是否为null。这是我的代码 using UnityEngine; using System.Collections; using
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class TurretScript : MonoBehaviour {
public float shotInterval = 0.2f; // interval between shots
public GameObject bulletPrefab; // drag the bullet prefab here
public float bulletSpeed;
private float shootTime = 0.0f;
private List<Transform> targets;
private Transform selectedTarget;
private Transform myTransform;
private Transform bulletSpawn;
void Start(){
targets = new List<Transform>();
selectedTarget = null;
myTransform = transform;
bulletSpawn = transform.Find ("bulletSpawn"); // only works if bulletSpawn is a turret child!
}
void OnTriggerEnter2D(Collider2D other){
if (other.tag == "enemy"){ // only enemies are added to the target list!
targets.Add(other.transform);
}
}
void OnTriggerExit2D(Collider2D other){
if (other.tag == "enemy"){
targets.Remove(other.transform);
Debug.Log("gone out");
}
}
void TargetEnemy(){
if (selectedTarget == null){ // if target destroyed or not selected yet...
SortTargetsByDistance(); // select the closest one
if (targets.Count > 0) selectedTarget = targets[0];
}
}
void SortTargetsByDistance(){
targets.Sort(delegate(Transform t1, Transform t2){
return Vector3.Distance(t1.position, myTransform.position).CompareTo(Vector3.Distance(t2.position, myTransform.position));
});
}
void Update(){
TargetEnemy(); // update the selected target and look at it
if (selectedTarget)
{
// if there's any target in the range...
Vector3 dir = selectedTarget.position - transform.position;
float angle = Mathf.Atan2(dir.y,dir.x) * Mathf.Rad2Deg;
transform.rotation = Quaternion.AngleAxis(angle, Vector3.forward);// aim at it
if (Time.time >= shootTime){// if it's time to shoot...
// shoot in the target direction
Vector3 lookPos = new Vector3(bulletSpawn.position.x,bulletSpawn.position.y,0);
lookPos = lookPos - transform.position;
float ang = Mathf.Atan2(lookPos.y,lookPos.x)*Mathf.Rad2Deg;
GameObject b1 = Instantiate(bulletPrefab,new Vector3(transform.position.x,transform.position.y,5),transform.rotation)as GameObject;
b1.rigidbody2D.velocity = new Vector3(Mathf.Cos(ang*Mathf.Deg2Rad),Mathf.Sin(ang*Mathf.Deg2Rad),0)*bulletSpeed;
shootTime = Time.time + shotInterval; // set time for next shot
}
}
}
}
这是我的敌人剧本
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class EnemyScript : MonoBehaviour {
public Transform target;
public float speed = 2f;
public int Health;
public float GetHealth()
{
return Health;
}
void Update ()
{
transform.position = Vector2.MoveTowards(transform.position, target.position, speed * Time.deltaTime);
}
void TakeDamage(int damage){
Health -= damage;
if (Health <= 0)
Destroy(gameObject);
}
void OnTriggerEnter2D(Collider2D otherCollider)
{
PlayerControl shot = otherCollider.gameObject.GetComponent<PlayerControl>();
if (shot != null)
{
SpecialEffectsHelper.Instance.Explosion(transform.position);
Destroy(shot.gameObject);
}
}
}
您需要检查所选目标是否是离开碰撞器的目标。您从目标列表中删除了目标,但仍然填充selectedTarget变量 对于null ref异常。你是在用毁灭来杀死目标吗?Destroy不会导致OnTiggerExit或OnCollisionExit事件调用,对象只是消失了
编辑:你可以通过在垂死的对象中添加一个OnDestroy函数来避免调用的缺失,该函数将其位置设置为玩家的关卡/视图之外的某个位置。这样,目标离开对撞机,然后消失,而不是仅仅消失在原地。选定的目标仍然填充为中?你能帮我吗,我被这两件事困住了,是的,我正在使用销毁方法杀死敌人脚本类中的对象。更新了敌人类的代码填充为not null。您只需要在OnTiggerExit2D中使用ifother.transform==selectedtarget{selectedtarget=null;}……它会给我相同的缺少引用异常。您是否按照建议进行了OnDestroy更改?如果是这样,我们可以看到更新的代码吗?但是,我也将从列表中删除敌人,并检查该值是否为null。