Ahm*_*far 7 c# game-engine unity-game-engine unityscript
我想在一个特定的圆形区域内销毁一个对象的实例.代码如下:
Collider2D[] overlap = Physics2D.OverlapCircleAll(
ball.transform.position,
(ball.renderer.bounds.size.x)/2);
if (overlap.Length>=1)
{
foreach (Collider2D coll in overlap)
{
Debug.Log (coll.GetInstanceID());
if (coll.name.Contains("alien"))
{
//problem here:
Destroy (coll.gameObject);
}
}
}
Run Code Online (Sandbox Code Playgroud)
该Destroy(coll.gameObject)破阵permanantly所有克隆和新的不实例化,我得到的错误MissingReferenceException: The object of type 'GameObject' has been destroyed but you are still trying to access it.
Your script should either check if it is null or you should not destroy the object.
有没有办法摧毁那个特定的克隆?我尝试了不同的名称和使用,Destroy(GameObject.Find(coll.name))但也破坏了所有克隆,并防止新的产生.
有人帮忙吗?
更新:
实例化如下:
private bool bCanCreateParachuter = true; // bool to stop the spawning
GameObject go;
// Use this for initialization
void Start () {
//handling screen orientation
Screen.orientation = ScreenOrientation.LandscapeLeft;
///
go = (GameObject)Instantiate(Resources.Load("alienPink"));
StartCoroutine("CreateParachuter");
}
IEnumerator CreateParachuter()
{
while(bCanCreateParachuter)
{
Instantiate(go, new Vector3(Random.Range(-10,10), Random.Range(-5,5), 0), Quaternion.identity);
// Instantiate(go, new Vector3(Random.Range(-10,10), Random.Range(-10,10), 0), Quaternion.identity);
go.name = "alienPink"+nextNameNumber;
nextNameNumber++;
yield return new WaitForSeconds(Random.Range(0f,1f));
yield return null;
}
yield return null;
}
Run Code Online (Sandbox Code Playgroud)
关键更新:
如果我取消注释if (grabbedObject !=null),代码可以工作
// if (grabbedObject != null) {
//works if uncomment above for some reason
Collider2D[] overlap = Physics2D.OverlapCircleAll (ball.transform.position, (ball.renderer.bounds.size.x)/2);
if (overlap.Length>=1){
foreach (Collider2D coll in overlap){
Debug.Log (coll.GetInstanceID());
if (coll.name.Contains("alien")){
Destroy (coll.gameObject);
}
}
}else {
// Debug.Log (grabbedObject.renderer.bounds.size.x);
}
Run Code Online (Sandbox Code Playgroud)
这是grabbedObject的背景:
Rigidbody2D grabbedObject = null;
. . .
RaycastHit2D hit = Physics2D.Raycast(mousePos2D , dir);
//if (hit!=null && hit.collider!=null){
// check collisions with aliens
// OnCollisionEnter2D(grabbedObject.collisionDetectionMode);
if ( hit.collider!=null){
// we clicked on something lol... something that has a collider (box2d collider in this case)
if (hit.collider.rigidbody2D!=null){
//hit.collider.rigidbody2D.gravityScale = 1;
grabbedObject = hit.collider.rigidbody2D;
// circleCollider = hit.collider.collider2D. ;
springJoint = grabbedObject.gameObject.AddComponent<SpringJoint2D>();
// set the anchor to the spot on the object that we clicked
Vector3 localHitPoint = grabbedObject.transform.InverseTransformPoint(hit.point);
springJoint.anchor = localHitPoint;
//
dragLine.enabled = true;
}
}
Run Code Online (Sandbox Code Playgroud)
基本上,grabbedObject是你在屏幕上点击并拖动的任何东西(任何GameObject),我在这里想念的是什么?
重生问题是您没有保存对资源项的引用,因此当您销毁第一个项目时,您创建的用于实例化的“模板”就会被销毁
这可以解决这个问题
GameObject template;
void Start()
{
//handling screen orientation
Screen.orientation = ScreenOrientation.LandscapeLeft;
template = (GameObject)Resources.Load("alienPink");
StartCoroutine("CreateParachuter");
}
IEnumerator CreateParachuter()
{
while(bCanCreateParachuter)
{
GameObject go = Instantiate(template, new Vector3(Random.Range(-10,10), Random.Range(-5,5), 0), Quaternion.identity);
go.name = "alienPink"+nextNameNumber;
nextNameNumber++;
yield return new WaitForSeconds(Random.Range(0f,1f));
yield return null;
}
yield return null;
}
Run Code Online (Sandbox Code Playgroud)
就销毁所有克隆而言,您的调试日志是否表明它正在销毁多个项目?如果是这样,碰撞可能确实会击中所有克隆体,从而将它们全部摧毁。
| 归档时间: |
|
| 查看次数: |
1026 次 |
| 最近记录: |