Unity_脚本操作对象_004

来源:互联网 发布:手写单例模式 java 编辑:程序博客网 时间:2024/05/22 13:14

GameObject属性

  • GameObject.activeSelf 是否活动

    该属性是一个只读属性我们可以通过打印日志的方式看到运行的结果

Debug.Log(gameObject.activeSelf);
  • GameObject.tag 标签

    该属性是一个可读可写的属性

//访问游戏对象的标签Debug.Log(gameObject.tag);

如果要通过代码对游戏对象修改tag值,确保已经在标签列表中添加过要修改的标签

gameObject.tag = "123";Debug.Log(gameObject.tag);
  • GameObject.layer 层
    访问或修改游戏对象所在的层,该属性也是可读可写。代码操作方式可tag操作相同
  • GameObject.name名字
    访问或修改游戏对象的名字
//访问游戏对象的名字Debug.Log(gameObject.name);//修改游戏对象的名字 不用提前预设  在游戏运行的时候会自行修改gameObject.name = "YY";

  • 克隆对象
    克隆游戏对象从效率上讲,克隆一个对象要比创建一个对象效率要高。常用于一些完全相同并且数量庞大的游戏对象,比如发射的子弹对象,每一颗子弹对象是完全一样的,每一次发射子弹都会克隆一个子弹对象,并且让克隆的子弹对象完成自己的生命周期。
    public static Object Instantiate (Object original)
    这实际上在Unity和使用复制(ctrl+D)命令是一样的。如果一个游戏物体,绑定了组件或脚本,将克隆整个游戏物体层次,以及所有子对象也会被克隆。所有游戏物体被激活。
    • public static Object Instantiate(Object original);
    • public static Object Instantiate(Object original, Transform parent);
      Object Instantiate(Object original, Transform parent, bool instantiateInWorldSpace);
    • public static Object Instantiate(Object original, Vector3 position, Quaternion rotation);
    • public static Object Instantiate(Object original, Vector3 position, Quaternion rotation, Transform parent);
    • public static T Instantiate(T original) where T : Object;
    • public static T Instantiate(T original, Transform parent) where T : Object;
    • public static T Instantiate(T original, Vector3 position, Quaternion rotation) where T : Object;
    • public static T Instantiate(T original, Transform parent, bool worldPositionStays) where T : Object;
    • public static T Instantiate(T original, Vector3 position, Quaternion rotation, Transform parent) where T : Object;
      这些方法都是克隆的重载方法
public GameObject obj;    // Use this for initialization    void Start ()     {        //默认的时候和预制体的坐标是保持一致的        GameObject my_obj01 = Instantiate(obj);        Debug.Log(my_obj01);        //在克隆的时候就把坐标初始化最终显示在场景中的游戏对象的位置就是设置的位置        //第一参数表示要克隆的游戏对象        //第二个参数是克隆后的游戏对象的位置        //第三个参数是克隆出来的游戏对象没有任何的旋转        GameObject my_obj02 = Instantiate(obj,new Vector3(1,1,1),Quaternion.identity);        //   激活对象//      my_obj02.SetActive(true);//   关闭对象//      my_obj02.SetActive(false);      }
  • 创建对象
    在Unity场景中出现的所有实体都属于游戏对象,比如系统自带的立方体、球体以及美工制作的.FBX游戏模型等。游戏对象与脚本联系常紧密,因为游戏对象之间的一切交互都需要使用脚本来完成。
    使用脚本来调用游戏对象的方式有两种:
    一、将脚本绑定在一个游戏对象上;
    二、在代码中动态绑定脚本和删除脚本。
    任何一个游戏对象都可以同时绑定多条游戏脚本,并且这些脚本互不干涉,各自完成各自的生命周期。
    GameObject.CreatePrimitive(PrimitiveType.Cube);
void Start () {        //创建基本的游戏对象  创建一个立方体        //该方法里面传入的是一个枚举类型        //该方法是一个静态的方法        GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Cube);}
  • 获取游戏对象
    1.GameObject.Find 查找
    static GameObject Find (string name) 找到并返回一个名字为name的游戏物体。
    如果以name为名字的游戏物体没有被找到,则返回空
    如果name中包含‘/’字符,这个名称将被视作一个hierarchy中的路径名.这个函数只返回活动的游戏物体。除非迫不得已,建议不要在每一帧中使用这个函数。可以在开始的时候用一个成员变量来缓存结果

    2.GameObject.FindWithTag 查找标签
    static GameObject FindWithTag (string tag)返回一个用tag做标识的活动的游戏物体,如果没有找到则为空。标签必须在使用之前到标签管理器里面声明。标签用于在脚本中通过标签名称快速查找物体。在标签管理器中可以设置层和标签。它位于菜单Edit->Project Settings->Tags.系统默认的7个标签:Untagged(未标记) Respawn(重生)Finish(完成)EditorOnly(只编辑)MainCamera(主摄像机)Player(游戏者)GameController(游戏控制器)

    3.GameObject.FindGameObjectsWithTag 查找相同标签的游戏物体列表static GameObject[] FindGameObjectsWithTag (string tag) 返回一个用tag做标识的活动的游戏物体的列表.如果没有找到则 为 空。标签必须在使用之前到标签管理器里面声明。

    4.运行游戏后,在代码中也可以动态添加与修改标签,但是必须提前在标签管理器中注册该标签,否则在程序 中修改标签时会抛出异常,提示无法找到该标签。

    参考代码:

    using System.Collections;    using System.Collections.Generic;    using UnityEngine;    public class GameObjectTest02 : MonoBehaviour     {        // Use this for initialization        void Start () {            GameObject obj01 = GameObject.Find("Capsule");            //访问obj01游戏对象的名字和tag            Debug.Log("obj01.name = " +obj01.name +"  obj01.tag ="+obj01.tag);            GameObject obj2 = GameObject.FindWithTag("Player");            //获取tag值为Player 的游戏对象            Debug.Log("obj2.name = " + obj2.name);            GameObject obj03 = GameObject.FindGameObjectWithTag("Player");            Debug.Log("obj03.name = " + obj03.name);            //获取所有标签为Person的游戏对象            GameObject[] objArr = GameObject.FindGameObjectsWithTag("Person");            //查看对象数组的中每一个游戏对象的信息            for (int i = 0; i < objArr.Length; i++)            {                Debug.Log("name = " + objArr[i].name + "  tag =" + objArr[i].tag);            }        }        // Update is called once per frame        void Update () {        }    }
  • 销毁游戏对象
    销毁对象
    public static void Destroy(Object obj);
    在t秒后销毁对象
    public static void Destroy(Object obj, [DefaultValue(“0.0F”)] float t);
    立刻销毁游戏对象
    public static void DestroyImmediate(Object obj);

  • 对象添加组件
    为了让游戏对象具备一些功能,就必须给其添加游戏组件。游戏组建的种类非常多。常见的游戏组件有脚本类、网格类、粒子类、物理类、声音类 和渲染类。

void Start () {        //创建一个空的游戏对象        GameObject emptyObj = new GameObject();        //给空的游戏对象添加一个Light组件  那么此游戏对象就成为一个灯光        //第一种为游戏对象添加组件        emptyObj.AddComponent(typeof(Light));        //第二种给游戏对象添加组件        //emptyObj.AddComponent<Light>();        //给灯光命名        emptyObj.name = "MyLight";    }
  • 获取对象组件
    void Start ()     {            //第一种获取组件的方式            //该方法获取的是绑定该脚本的游戏对象身上的Light组件  如果获取不到则m_LightComponent为空            //Component m_LightComponent = GetComponent(typeof(Light));            ////一般情况下我们获取某个游戏对象身上的组件的时候需要和获取游戏对象一起使用            //GameObject my_light = GameObject.Find("Directional Light");            ////第二种获取游戏对象组件的方式            //my_light.AddComponent<Light>();            //创建一个空的游戏对象            //空的游戏对象下挂载了1个Cube            //如果空物体下挂载了多个具有相同组件的游戏对象  则只会返回第一个            //如果空物体身上也有相同的组件  那么会返回空物体身上的组件            GameObject emptyGameObject = GameObject.Find("GameObject");            //获取emptyGameObject的子物体身上的组件            BoxCollider col = emptyGameObject.GetComponentInChildren<BoxCollider>();            //通过col找到gameObject,在打印出游戏对象的名字            Debug.Log(col.gameObject.name);            Console.WriteLine("*******************");            //获取游戏对象所有带有BoxCollider组件的游戏对象            BoxCollider[] cols = emptyGameObject.GetComponentsInChildren<BoxCollider>();            foreach (BoxCollider item in cols)            {                Debug.Log(item.gameObject.name);            }    }
  • 删除游戏对象组件
    删除游戏对象组件的时候一般都不是单独存在的,我们要向删除,必须知道是删除的那个游戏对象身上的游戏组件
void Start (){    //获取游戏对象    GameObject m_light = GameObject.Find("Directional Light");    //获取组件    Light component = m_light.GetComponent<Light>();    //删除组件    Destroy(component);}