使用基于图层的碰撞球体c# Unity显示对象时遇到麻烦

本文关键字:Unity 显示 对象 麻烦 遇到 碰撞 于图层 图层 | 更新日期: 2023-09-27 18:02:32

我在让游戏机制正确运行时遇到了一些问题。基本上我有两个区域:Collidersight和Colliderfatal,它们是由连接在炮弹上的碰撞球定义的,炮弹是由大炮发射的。从本质上讲,我希望任何在Collidersight区域内的物体只要在该特定区域内就会被显示,如果它们在该区域外,它们应该返回到不可见状态。如果一个对象与Colliderfatal碰撞,那么该对象应该永久显示,即使在shell被销毁之后。我已经尝试单独初始化游戏对象,但这似乎非常令人困惑,不适用于这种情况。游戏对象已经存在于场景中,我没有实例化它们。有人告诉我,我可能需要创建一个游戏对象列表来在碰撞球中循环,作为这个问题的潜在解决方案,但我完全不知道如何实现这一点。

代码如下:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class zone : MonoBehaviour {
 public LayerMask m_SightLayers;
public LayerMask  s_FatalityLayers;
    public Vector3 m_Position;
    public float m_Radius;
    public float m_Force;
    public float s_Radius;
    public Vector3 s_Position;
    public Invisible1 revealenemy1;
    public Invisible1 enemykill1; 
    public float s_Force;
    public InvisibleKill makeDead;
    public GameObject EnemyCube1; 
    //public GameObject enemydead; 
    bool hasExploded;
    public bool inZone;
    public bool inKillzone;
    //public float removeTime = 5.0f;
    bool hasBeenhit;
    void Awake(){
    GameObject[] objects = GameObject.FindGameObjectsWithTag("Enemy");  
    }

    void start (){
    makeDead = (InvisibleKill) EnemyCube1.GetComponent (typeof(InvisibleKill));
    revealenemy1 = (Invisible1) EnemyCube1.GetComponent(typeof(Invisible1));    
    }
    void OnCollisionEnter(Collision explode){
        if(explode.gameObject.name == "Terrain" || explode.gameObject.name == "EnemyCube" || explode.gameObject.name == "EnemyCube1" ){
            hasExploded = true;
        }
    }
    void FixedUpdate ()
    {
        if (hasExploded == true){
        Collider[] collidersight;
        Collider[] colliderfatal;
        Rigidbody rigidbody;

        collidersight = Physics.OverlapSphere (transform.position + m_Position, m_Radius, m_SightLayers);
        foreach (Collider collider in collidersight)
        {
            if(collider.tag == "Enemy"){
                Debug.Log("stuff");

                }

            rigidbody = (Rigidbody) collider.gameObject.GetComponent (typeof (Rigidbody));
            if (rigidbody == null)
            {
                    continue;
                    }
            if(rigidbody.gameObject.tag == "Enemy"){
                inZone = true;


            if(inZone == true){
            revealenemy1.Reveal1(); 
          //  revealenemy2.Reveal2();
            //revealenemy3.Reveal3();

                Debug.Log ("hit");
                    hasBeenhit = true;

                    if(hasBeenhit == false){
                        hasBeenhit = false;
                    //  revealenemy1.Hidden();
                    ////    revealenemy2.Hidden2();
                //      revealenemy3.Hidden3();
                    }
            }else{
                }
                }
            }   
        //Debug.Log (hasExploded);
        colliderfatal = Physics.OverlapSphere (transform.position + s_Position,s_Radius,s_FatalityLayers);
        foreach (Collider collider in colliderfatal)
        {
            inKillzone = true; 
        rigidbody = (Rigidbody) collider.gameObject.GetComponent (typeof (Rigidbody));
            if (rigidbody ==null)
            {
            continue;   

            }
            rigidbody.AddExplosionForce (s_Force * -1, transform.position + s_Position,s_Radius);
            Debug.Log("hasbeenkilled");
                }

        }
        if(hasBeenhit == false){
            revealenemy1.Hidden();
            //revealenemy2.Hidden2();
            //revealenemy3.Hidden3 ();
        hasBeenhit = false;
        }
        if(inKillzone == true){
            //EnemyCube1.GetComponentInChildren (typeof(Invisible1));
            hasBeenhit = true;
            //revealenemy.renderer.enabled = true;
        //  makeDead.isdead = true; 
                //(typeof(Invisible1));
        }
        if(makeDead.isdead == true){
            revealenemy1.Reveal1();
        }

    }
  void OnDrawGizmosSelected ()  {
        Gizmos.color = Color.red;
        Gizmos.DrawWireSphere (transform.position + m_Position, m_Radius);
        //Gizmos.DrawWireSphere (transform.position + s_Position, s_Radius);
    }
    void OnDrawGizmos()
    {
        Gizmos.color = Color.blue;
        Gizmos.DrawWireSphere (transform.position + s_Position, s_Radius);
    }
}

使用基于图层的碰撞球体c# Unity显示对象时遇到麻烦

当对象渲染器进入区域时,为什么不简单地激活/停用对象渲染器呢?你规定进入"致命"区域的物体是永久可见的,我认为这意味着即使它们离开该区域,它们也是可见的。

可视性类,放置在任何你想改变其可见性的对象上:

public class Visibility : MonoBehaviour {
    public bool LockVisibility = false;
    public void SetVisible(bool state){
        if(LockVisibility)return;
        renderer.enabled = state;
    }
}

和碰撞检测类。

public class CollisionRender : MonoBehaviour {
//example collision types
public enum CollisionTypes { Fatal,InSight };
public CollisionTypes CollisionType = CollisionTypes.InSight;
//turn renderer on.  
void OnTriggerEnter(Collider other) {
    Visibility vis = other.gameObject.GetComponent<Visibility>();
    if(CollisionType == CollisionTypes.InSight){
        vis.SetVisible(true);
    }else if(CollisionType == CollisionTypes.Fatal){
        //if in 'fatal' zone, make visible and lock visibility.
        vis.SetVisible(true);
        vis.LockVisibility = true;
    }
}
void OnTriggerExit(Collider other) {
    Visibility vis = other.gameObject.GetComponent<Visibility>();
    vis.SetVisible(false);
}
}

我使用触发器,所以你的碰撞器将需要有' isttrigger '检查工作