【问题标题】:Unity creates two clones of an object, despite instantiate been called only onceUnity 创建了一个对象的两个克隆,尽管实例化只被调用了一次
【发布时间】:2014-03-27 19:31:13
【问题描述】:

我正在 Unity 中处理一些敌方 AI,但是当我尝试实例化单个射弹时,它会在完全相同的位置创建两个。即使实例化被调用一次,也会发生这种情况。

实例化代码:

void Shoot(Vector3 direction){

    GameObject EnemyLaser = (GameObject)Instantiate(Resources.Load("EnemyLaser"), FirePosition.transform.position, FirePosition.transform.rotation);
    EnemyLaser.renderer.material.color = gameObject.renderer.material.color;
    EnemyLaser.rigidbody.velocity = direction * laserPower;
}

触发代码:

void FireRaycast(){

    Vector3 direction = transform.TransformDirection(Vector3.forward);
    RaycastHit hit;

    Debug.DrawRay(transform.position, direction * range);

    if(Physics.Raycast(transform.position, direction, out hit, range)){

        if(hit.collider.tag == "Player"){

            if(currentTime > fireInterval){
                Shoot(direction);
                currentTime = 0;
            }
        }
    }

    currentTime += Time.deltaTime;

}

这会导致多个问题,例如两个射弹由于它们的对撞机而无法移动等......

我尝试使用布尔值来检查该函数是否只被调用一次,但它仍然会创建两个对象。

【问题讨论】:

  • Resources.Load 本身确实已经创建了一个实例。只取它的返回值
  • @Kay 在 GameObject 上使用 Resources.Load 将获得对预制件的引用。但它不会自动实例化它。
  • @esa 感谢您清除此问题,我没有将 Load 与 GameObjects 一起使用,但仅与 TextAssets、图像、...一起使用
  • FireRaycast 多久调用一次?你确定它只被调用一次吗?在 Shoot 中设置断点会发生什么?

标签: c# unity3d


【解决方案1】:

我不知道您的问题是否已解决,但这也发生在我身上,原因与前面提到的不同。

在我的例子中,我使用mouse click event 在环境中生成对象。我使用的是Input.GetMouseButtonDown(0),由于某种原因,每次点击都会返回两次true,从而创建了我的预制件的两个实例。

对我来说,解决方案是对实例化新对象的频率设置时间限制。之后,每次鼠标点击只创建一个实例。

【讨论】:

    猜你喜欢
    • 2016-06-08
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    相关资源
    最近更新 更多