草庐IT

【Unity学习笔记】基础游戏单位GameObject中常用的属性和API

ElecSheep 2023-03-28 原文

一、GameObject中的成员变量

主要思想:得到该脚本依附的GameObject的相关信息
现有:

Lesson4的代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson4 : MonoBehaviour
{
    void Start()
    {
        //1.得到名字
        print(this.gameObject.name);

        //2.更改名字
        this.gameObject.name = "Lesson4的新名字";
        print(this.gameObject.name);

        //3.得到是否激活
        print(this.gameObject.activeSelf);

        //4.得到是否开启了静态
        print(this.gameObject.isStatic);

        //5.得到层级(Layer)
        print(this.gameObject.layer);

        //6.得到标签(Tag)
        print(this.gameObject.tag);

        //7.得到transform
        //this.transform这种方法是Mono提供的
        //this.gameObject.transform是GameObject提供的
        //这两种写法得到的信息是完全一样的
        print(this.gameObject.transform.position);
    }
}

运行:

二、GameObject中的静态方法

2-1.创建Unity自带的几何体

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Lesson4 : MonoBehaviour
{
    void Start()
    {
        GameObject.CreatePrimitive(PrimitiveType.Cube);

        //补充:
        //这个静态方法是有GameObject类型返回值的,
        //可以用一个GameObject变量去接收它,然后再做后续的逻辑处理
        GameObject obj =  GameObject.CreatePrimitive(PrimitiveType.Sphere);
        //比如改个名字
        obj.name = "我用代码创建的几何体";
        //还能得到这个几何身上挂载的脚本
        //obj.GetComponent...
    }
}

运行:

2-2.查找对象相关

无法找到失活的对象

现有:

Lesson4的代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson4 : MonoBehaviour
{
    void Start()
    {
        //1.查找单个对象
        //两种方法的共同点:
        //  -无法找到失活的对象
        //  -如果场景中有多个满足查找条件的对象,我们无法确定找的是哪一个
        //  1-1.通过对象名查找
        //      这个查找效率比较低 因为它会在场景中所有对象中进行查找
        //      找到了 就返回对应对象,没找到 返回null
        GameObject obj2 = GameObject.Find("Wall");
        //      保险起见,使用前先判断是否找到
        if (obj2 != null)
        {
            print("根据名字找的对象:" + obj2.name);
        }
        else
        {
            print("没找到Wall对象");
        }

        //  1-2.通过Tag查找
        GameObject obj3 = GameObject.FindWithTag("Player");
        //      或写成(这两种写法是一模一样的)
        //obj3 = GameObject.FindGameObjectWithTag("Player");
        //      保险起见,使用前先判断是否找到
        if (obj3 != null)
        {
            print("根据Tag找的对象:" + obj3.name);
        }
        else
        {
            print("没找到Tag为Player的对象");
        }

        //学到现在,目前有两种得到单个对象的方式:
        //  -先暴露出去,然后从外部面板拖进去 进行关联
        //  -通过API去查找

        //2.查找多个对象
        //  只能通过Tag去查找多个对象
        //  将返回一个GameObject数组
        GameObject[] objs = GameObject.FindGameObjectsWithTag("Player");
        print("Tag为Player的对象个数:" + objs.Length);

        //补充:还有几个用的很少的查找方法,都是GameObject的父类Object提供的方法
        //引出的额外知识点:Unity里的Object 不是指C#里的万物之父object
        //Unity里的Object是Unity自己写的,它也属于万物之父object
        //Unity的Object的命名空间在UnityEngine中;C#的object的命名空间在System中
        //此方法可找到场景中挂载了某一个脚本的对象(谁挂了这个脚本 就找谁)
        //此方法效率更加底下,因为它不仅要去遍历对象,还要去遍历脚本
        Lesson4 l4 = GameObject.FindObjectOfType<Lesson4>();
    }
}

运行:

2-3.实例化(克隆)、删除对象的方法

被克隆的对象:①可以是场景上的对象、②可以是一个预制体
现有:

Lesson4的代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson4 : MonoBehaviour
{
    //准备用来被克隆的对象
    public GameObject obj;
    //准备用来被删除的对象
    public GameObject obj2;

    void Start()
    {
        //实例化(克隆)对象
        //作用:根据一个GameObject对象创建出一个和它一模一样的GameObject对象
        //将会返回一个被克隆的对象,使用GameObject类型的变量接收
        GameObject insObj = GameObject.Instantiate(obj);
        //接收之后,就可以随意操纵insObj了

        //补充:如果继承了MonoBehaviour 可以不用写前面的GameObject
        //因为这个方法是Unity的Object基类提供的,所以可以直接用
        //Instantiate(obj);

        //删除对象
        //1.下一帧就删除
        GameObject.Destroy(obj2);

        //2.延迟一段时间后 再删除
        //参数1 要删除的对象
        //参数2 几秒后删除
        GameObject.Destroy(obj2, 3);

        //3.Destroy不仅可以删除对象,还可以删除脚本
        GameObject.Destroy(this); //把自己这个脚本删除

        //注意:这个Destroy不会马上删除对象,只是给这个对象加了一个移除标识
        //     一般情况下,会在下一帧 把对象删除,这么做是为了减少卡顿
        //如果有特殊需求 需要马上删除对象(一般很少用)
        //GameObject.DestroyImmediate(obj2);

        //补充:如果继承了MonoBehaviour 可以不用写前面的GameObject
        //因为这个方法是Unity的Object基类提供的,所以可以直接用
        //Destroy(obj2);
    }
}

下一步:

运行:

2-4.GameObject对象过场景不移除

Unity中可以创建多个游戏场景,难免会场景之间来回切换
Unity的机制是,一旦切换到另一个场景,此场景里的对象会被全部移除
如果有的对象不想在切换场景的时候被移除

现有:

Lesson4的代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson4 : MonoBehaviour
{
    void Start()
    {
        //谁不想切换场景时被移除,就传入谁
        //一般都是传依附的GameObject对象
        //下面这句代码的意思就是 本脚本依附的对象切换场景不被移除
        GameObject.DontDestroyOnLoad(this.gameObject);

        //补充:如果继承了MonoBehaviour 可以不用写前面的GameObject
        //因为这个方法是Unity的Object基类提供的,所以可以直接用
        DontDestroyOnLoad(this.gameObject);
    }
}

运行并切换场景:
此时Lesson4就不会被自动移除了

三、GameObject中的成员方法

3-1.创建空GameObject对象相关

现有:

Lesson4的代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson4 : MonoBehaviour
{
    void Start()
    {
        //new一个GameObject就是在创建一个空物体
        GameObject obj = new GameObject();
        //还创建的同时直接命名
        GameObject obj2 = new GameObject("创建的同时直接命名");
        //创建的同时直接命名并挂载脚本(想挂几个都行)
        GameObject obj3 = new GameObject("创建的同时直接加脚本", typeof(Lesson3),  typeof(Lesson2));
    }
}

运行:

3-2.为现有GameObject对象添加脚本

之前说过继承了Mono的脚本 是不能够new的
如果我们想动态地给现有对象添加脚本的话,就需要使用GameObject提供的方法

现有:

Lesson3的代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Lesson4 : MonoBehaviour
{
    //想要添加脚本的GameObject对象
    public GameObject obj;

    void Start()
    {
        //为obj添加脚本 谁想加脚本就用谁 .AddComponent
        //这种方法用的少,因为返回值还要as
        Lesson3 les3 = obj.AddComponent(typeof(Lesson3)) as Lesson3;
        //一般使用泛型
        Lesson2 les2 = obj.AddComponent<Lesson2>();
        //通过返回值 得到添加的脚本的信息,来做后续的逻辑处理

        //补充:关系得到脚本,GameObject里得到脚本的方法 和Mono里得到脚本的方法一模一样,用谁的都可以
        //都是.GetComponent系列
    }
}

下一步:

运行:

3-3.标签比较

现有:

Lesson4的代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson4 : MonoBehaviour
{
    void Start()
    {
        //方法一:
        //判断这个对象的标签是否是 Player
        //返回值是bool
        if (this.gameObject.CompareTag("Player");
        {
            print("没错,对象的标签是Player");
        }
        //这两种↑↓方法是一模一样的
        //方法二:
        if (this.gameObject.tag == "Player")
        {
            print("没错,对象的标签是Player");
        }
    }
}

运行:

3-4.设置激活失活

现有:

Lesson4的代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson4 : MonoBehaviour
{
    //想要激活的对象
    public GameObject Jihuo;
    //想要失活的对象
    public GameObject shiHuo;
    void Start()
    {
        //激活
        Jihuo.SetActive(true);
        //失活
        shiHuo.SetActive(false);
    }
}

下一步:

运行:

3-5.次要的成员方法(了解即可,不建议使用)

通过广播或发送消息,让自己或别人 执行某些行为方法
现有:

Lesson4的代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson4 : MonoBehaviour
{
    void Start()
    {
        //通知自己 执行某行为
        //它会在自己身上挂载的所有脚本中 去找TestFun函数,并执行所有名为TestFun的函数
        this.gameObject.SendMessage("TestFun");
        //有参数的 直接传即可
        this.gameObject.SendMessage("TestFun2", 99);

        //再补充两个,不举例子了
        //1.广播行为 让自己和自己的子对象去执行
        //this.gameObject.BroadcastMessage("函数名");
        //2.向父对象和自己发送消息 并执行
        //this.gameObject.SendMessageUpwards("函数名")
    }
    
    void TestFun()
    {
        print("Lesson4的TestFun被执行了");
    }
    void TestFun2(int i)
    {
        print("Lesson4的TestFun2被执行了" + i);
    }
}

Lesson4_1的代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson4_1 : MonoBehaviour
{
    void TestFun()
    {
        print("Lesson4_1的TestFun被执行了");
    }
    void TestFun2(int i)
    {
        print("Lesson4_1的TestFun2被执行了" + i);
    }
}

运行:

有关【Unity学习笔记】基础游戏单位GameObject中常用的属性和API的更多相关文章

  1. ruby-on-rails - 如果为空或不验证数值,则使属性默认为 0 - 2

    我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val

  2. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  3. ruby - 多个属性的 update_column 方法 - 2

    我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2

  4. ruby - Nokogiri 剥离所有属性 - 2

    我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog

  5. ruby-on-rails - Rails 模型——非持久类成员或属性? - 2

    对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs

  6. ruby-on-rails - ActionController::RoutingError: 未初始化常量 Api::V1::ApiController - 2

    我有用于控制用户任务的Rails5API项目,我有以下错误,但并非总是针对相同的Controller和路由。ActionController::RoutingError:uninitializedconstantApi::V1::ApiController我向您描述了一些我的项目,以更详细地解释错误。应用结构路线scopemodule:'api'donamespace:v1do#=>Loginroutesscopemodule:'login'domatch'login',to:'sessions#login',as:'login',via::postend#=>Teamroutessc

  7. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  8. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  9. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

  10. unity---接入Admob - 2

    目录1.AdmobSDK下载地址2.将下载好的unityPackagesdk导入到unity里​编辑 3.解析依赖到项目中

随机推荐