【发布时间】:2018-08-19 09:09:52
【问题描述】:
我在实例化对象时将参数传递给对象时遇到了一点问题,让我更好地解释一下: 我统一制作了一个自动炮塔,它只是瞄准一个敌人并实例化一个摧毁敌人的导弹。炮塔很好用,我只是在导弹上遇到了一些问题...... 导弹是一个附加脚本的游戏对象,在这个脚本中,我只有 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 编辑为 private,并创建了一个“setter”公共方法。 真诚地,我不知道为什么它解决了我的问题......
【问题讨论】:
-
设置“目标”字段的代码在哪里?
-
糟糕,我刚刚编辑了帖子
-
好的,Turret 在哪里设置 Target 属性?
-
你能告诉我们你在哪里设置目标吗?这可能是问题所在。
-
对不起,我编辑了帖子。要设置目标,我只需执行“missile.GetComponent
().target = Target;”