Unity3d 在游戏对象离开摄像机的视野后销毁它
我目前正在Unity中制作一个游戏,我试图在一个预制场的克隆人离开摄像机的视野后,在他们已经进入摄像机的视野后,才能摧毁他们。然而,由于某些原因,我的代码在克隆实例化后会立即销毁它们。有人知道我如何解决这个问题吗Unity3d 在游戏对象离开摄像机的视野后销毁它,unity3d,game-development,collider,Unity3d,Game Development,Collider,我目前正在Unity中制作一个游戏,我试图在一个预制场的克隆人离开摄像机的视野后,在他们已经进入摄像机的视野后,才能摧毁他们。然而,由于某些原因,我的代码在克隆实例化后会立即销毁它们。有人知道我如何解决这个问题吗 using System.Collections; using System.Collections.Generic; using UnityEngine; public class InteractControl : MonoBehaviour { Rigidbody2D
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class InteractControl : MonoBehaviour
{
Rigidbody2D rb;
GameObject target;
float moveSpeed;
Vector3 directionToTarget;
// Use this for initialization
void Start()
{
target = GameObject.Find("White Ball");
rb = GetComponent<Rigidbody2D>();
moveSpeed = 3f;
}
// Update is called once per frame
void Update()
{
MoveInteract();
OnBecameVisible();
}
/*void OnTriggerEnter2D(Collider2D col)
{
switch (col.gameObject.tag)
{
case "ColouredBall Highress":
BallSpawnerControl.spawnAllowed = false;
Destroy(gameObject);
target = null;
break;
case "Star":
Collision collision = new Collision();
break;
}
} */
void MoveInteract()
{
if (target != null)
{
if(ScoreScript.scoreValue > 3)
{
directionToTarget = (target.transform.position - transform.position).normalized;
rb.velocity = new Vector2(directionToTarget.x * moveSpeed,
directionToTarget.y * moveSpeed);
}
else
{
directionToTarget = new Vector3(0, -1, 0);
rb.velocity = new Vector2(0, directionToTarget.y * moveSpeed);
}
}
else
rb.velocity = Vector3.zero;
}
void OnBecameInvisible()
{
if (gameObject.tag == "ColouredBall Highress")
{
Destroy(gameObject);
}
if (gameObject.tag == "Star")
{
Destroy(gameObject);
}
}
void OnBecameVisible()
{
if (gameObject.tag == "ColouredBall Highress" || gameObject.tag == "Star")
{
OnBecameInvisible();
}
}
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
公共类交互控制:单行为
{
刚体2d rb;
游戏对象目标;
浮动速度;
矢量3指向目标;
//用于初始化
void Start()
{
target=GameObject.Find(“白球”);
rb=GetComponent();
移动速度=3f;
}
//每帧调用一次更新
无效更新()
{
MoveInteract();
OnBecameVisible();
}
/*无效OnTriggerEnter2D(碰撞的R2D列)
{
开关(col.gameObject.tag)
{
案例“彩色球女高音”:
BallSpawnerControl.spawnAllowed=false;
摧毁(游戏对象);
target=null;
打破
案例“Star”:
碰撞=新的碰撞();
打破
}
} */
void MoveInteract()
{
如果(目标!=null)
{
如果(ScoreScript.scoreValue>3)
{
directionToTarget=(target.transform.position-transform.position).normalized;
rb.velocity=新矢量2(方向到目标x*移动速度,
方向至目标y*移动速度);
}
其他的
{
directionToTarget=新向量3(0,-1,0);
rb.velocity=新矢量2(0,方向到目标y*移动速度);
}
}
其他的
rb.速度=矢量3.0;
}
void onbecame隐身()
{
如果(gameObject.tag==“彩色球女高音”)
{
摧毁(游戏对象);
}
如果(gameObject.tag==“Star”)
{
摧毁(游戏对象);
}
}
void OnBecameVisible()
{
if(gameObject.tag==“彩色球女高音”| | gameObject.tag==“星形”)
{
onbecame隐身();
}
}
}
我试图解决这个问题,首先要求物体变得可见,这样当它们不在摄像机的视野内时就可以被破坏。简而言之,我正在寻找OnBecameInvisible上的OnExit对撞机版本。我想我可以把整个屏幕做成一个对撞机,并在它上面使用退出对撞机。有人可能也知道我如何制作一个覆盖摄影机视图的对撞机吗?您正在调用BecameVisible每一帧,因此基本上第一帧对象会破坏自身。从更新中删除它应该可以做到这一点,Unity已经为您调用了它。这是因为您从
OnBecameVisible
中调用OnBecameVisible()
。因此,当它们可见时,它们就会被摧毁
此外,您的代码正在做许多冗余的事情,您也可以从Update
等调用OnBecameVisible
您只需使用此选项即可:
Renderer m_Renderer;
void Start()
{
m_Renderer = GetComponent<Renderer>();
}
void Update()
{
//It means object is NOT visible in the scene if it is false is visible
if (!m_Renderer.isVisible)
{
Destroy(gameObject);
}
}
渲染器m_渲染器;
void Start()
{
m_Renderer=GetComponent();
}
无效更新()
{
//如果对象为false,则表示该对象在场景中不可见
如果(!m_Renderer.isVisible)
{
摧毁(游戏对象);
}
}
请注意:在这种情况下,销毁/实例化对象不是最佳做法。因为它会导致垃圾收集器大量工作,而且价格昂贵,并且会降低游戏速度。您可以使用。它基本上将不在视野中的对象放入对象池,您保留它们的引用,以后可以使用它们。因此,它的成本比您的方法要低。但OnBecomeVisible应该要求对象首先处于可见状态,然后才能进入不可见状态。我该如何解决这个问题?@MauriceBekambo您的代码中没有跟踪“我以前是可见的”。现在您正在从
Update
调用OnBecameVisible
(而不是让Unity为您调用它!),这个方法所做的就是调用OnBecameVisible
,所做的就是销毁对象。注意OnBecameVisible()
本身就是从Update()
调用的。是的,我不明白为什么。