我在实例化参数时将参数传递给对象时遇到一些问题,让我对其进行更好的解释: 我统一制造了一个自动炮塔,它只是瞄准敌人并实例化一枚摧毁敌人的导弹。炮塔效果很好,我只在导弹方面有一些问题... 导弹是一个附带脚本的游戏对象,在此脚本中,我只有1个公共变量,类型为“ GameObject”,名称为“ target”,当(从炮塔脚本中)实例化导弹时,我设置了变量“目标”等于炮塔瞄准的敌人。 在启动功能(导弹脚本)中,我将导弹向“目标”旋转,并增加导弹的位置,可以击中敌人。
导弹脚本:
public GameObject target;
private Vector3 targetPosition;
// Use this for initialization
void Start () {
transform.SetParent(GameObject.FindGameObjectWithTag("Canvas").transform);
targetPosition = target.transform.position;
//Rotation of the missile
Vector3 difference = this.targetPosition - transform.position;
float rotationZ = Mathf.Atan2(difference.y, difference.x) * Mathf.Rad2Deg;
transform.rotation = Quaternion.Euler(0.0f, 0.0f, rotationZ);
}
// Update is called once per frame
void Update () {
// The step size is equal to speed times frame time.
float step = 1.5f * Time.deltaTime;
// Move our position a step closer to the target.
transform.position += transform.right * step;
}
private void OnCollisionEnter2D(Collision2D collision)
{
Destroy(collision.gameObject);
Destroy(this.gameObject);
}
炮塔脚本
public GameObject missile; //this is the missile prefab
void OnTriggerEnter2D(Collider2D collision)
{
if(collision.gameObject.tag == "enemy") //The turret is aiming an enemy
{
Target = collision.gameObject;
StartCoroutine(openFire());
}
}
IEnumerator openFire()
{
GameObject newMissile;
newMissile = Instantiate(missile, this.transform.position, Quaternion.identity, GameObject.FindGameObjectWithTag("Canvas").transform);
missile.GetComponent<missileScript>().target = Target;
yield return new WaitForSeconds(1);
if (Target != null)
StartCoroutine(openFire());
}
一切正常,当我拥有多个炮塔时,就会出现问题:如果我有两个炮塔(炮塔A和炮塔B),并且同时两个炮塔都向两个不同的敌人射击,由于某些原因,这两种导弹都会有相同的目标。 因此,例如,如果炮塔“ A”向敌人“ 1”射击,而炮塔“ B”同时向敌人“ 2”射击,则两枚导弹都将朝同一敌人射击。
我希望我很清楚。对可能是什么问题有任何想法吗?
谢谢。
-----固定-----
我只是简单地将变量“ target”由public编辑为私有,然后将其设置为“ setter” public方法。 真诚的我不知道为什么它可以解决我的问题...
答案 0 :(得分:2)
您要覆盖您的预制件:
missile = Instantiate(missile, ...)
您确实声明了GameObject newMissile
,但您没有使用它。
第二:
if (Target != null)
如果目标不为空,您将重新启动OpenFire方法...但是您仍然实例化一颗导弹!您可能想要更改它。