【问题标题】:Passing parameters on instantiation in Unity在 Unity 中实例化时传递参数
【发布时间】: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;”

标签: c# unity3d


【解决方案1】:

您正在覆盖您的预制件:

missile = Instantiate(missile, ...)

您确实声明了GameObject newMissile,但您没有使用它。

第二:

if (Target != null)

如果目标不为空,您将重新启动 OpenFire 方法...但您仍会实例化导弹!您可能想要更改此设置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-29
    • 1970-01-01
    • 2014-11-24
    • 2016-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多