【Unity基础知识】基础游戏单位GameObject中常用的属性和API
一、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的更多相关文章
- Vue基础系列(二)——Vue中的methods属性
写在前面的话: 文章是个人学习过程中的总结,为方便以后回头在学习. 文章中会参考官方文档和其他的一些文章,示例均为亲自编写和实践,若有写的不对的地方欢迎大家指出. 作者简介: 一个不知名的前端开发 ...
- javascript中常用坐标属性offset、scroll、client
原文:javascript中常用坐标属性offset.scroll.client 今天在学习js的时候觉得这个问题比较容易搞混,所以自己画了一个简单的图,并且用js控制台里面输出测试了下,便于理解. ...
- C#基础知识汇总(不断更新中)
------------------------------目录---------------------------- 1.隐式类型2.匿名类型3.自动属性4.初始化器5.委托6.泛型7.泛型委托8 ...
- Java基础知识强化101:Java 中的 String对象真的不可变吗 ?
1. 什么是不可变对象? 众所周知, 在Java中, String类是不可变的.那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对 ...
- Java基础知识强化03:Java中的堆与栈
1.在JVM中,内存分为两个部分,Stack(栈)和Heap(堆),这里,我们从JVM的内存管理原理的角度来认识Stack和Heap,并通过这些原理认清Java中静态方法和静态属性的问题. 一般,JV ...
- Java基础知识强化21:Java中length、length()、size()区别
1.java中的length属性是针对数组说的,比如说你声明了一个数组,想知道这个数组的长度则用到了length这个属性.2.java中的length()方法是针对字符串String说的,如果想看这个 ...
- Blazor和Vue对比学习(基础1.8):Blazor中实现计算属性和数据监听
1.7章<传递UI片断>,需要做几个案例,这部分暂停消化几天.我们先把基础部分相对简单的最后两章学习了. 计算属性和数据监听是Vue当中的概念,本质上都是监听数据的变化,然后做出响应.两者 ...
- 视频基础知识:浅谈视频会议中H.264编码标准的技术发展
浅谈视频会议中H.264编码标准的技术发展 浅谈视频会议中H.264编码标准的技术发展 数字视频技术广泛应用于通信.计算机.广播电视等领域,带来了会议电视.可视电话及数字电视.媒体存储等一系列应用,促 ...
- CSS 一些基础知识(优先级、行内元素的一些属性、font-size单位) 怎样不加载图片
CSS大小写不敏感 选择器优先级如下所示: 在属性后面使用 !important 会覆盖页面内任何位置定义的元素样式. 作为style属性写在元素内的样式 id选择器 类选择器 标签选择器 通配符选择 ...
随机推荐
- 一键解决Win10 LTSC 2021官方镜像存在的问题
一键解决Win10 LTSC 2021官方镜像存在的问题 由于适用了win10 ltsc 2021之后,发现官方镜像存在一些致命的bug.但是本人又喜欢这个官方精简的系统,所以进行了一些修复.并将搜集 ...
- Hyperledger Fabric 核心概念
一.说明 区块链是一个透明的,基于不可变模式的去中心化系统,核心就是一个分布式账本,记录网络上发生的所有交易. 区块链网络主要有三种类型:公共区块链.联盟区块链,以及私有区块链:我们熟知的比特币.以太 ...
- 使用DSVPN解决分支网络出口为ADSL场景下的内网互通
背景 最近接到一个项目是一家机构总部与多个分支之间的内网互通,总部具有固定ip,分部是使用adsl动态获取的不固定公网ip,由于两端互联网ip不固定所以不能使用传统的GRE技术来实现,所以最后经过评估 ...
- 一文看懂 ZooKeeper ,面试再也不用背八股(文末送PDF)
ZooKeeper知识点总结 一.ZooKeeper 的工作机制 二.ZooKeeper 中的 ZAB 协议 三.数据模型与监听器 四.ZooKeeper 的选举机制和流程 本文将以如下内容为主线讲解 ...
- 04 Springboot 格式化LocalDateTime
Springboot 格式化LocalDateTime 我们知道在springboot中有默认的json解析器,Spring Boot 中默认使用的 Json 解析技术框架是 jackson.我们点开 ...
- 第06组 Beta冲刺 (2/5)
目录 1.1 基本情况 1.2 冲刺概况汇报 1.郝雷明 2. 方梓涵 3.杜筱 4.黄少丹 5. 董翔云 6.鲍凌函 7.詹鑫冰 8.曹兰英 9.曾丽莉 10.吴沅静 1.3 冲刺成果展示 1.1 ...
- 第06组 Alpha冲刺 (2/6)
目录 1.1 基本情况 1.2 冲刺概况汇报 1.郝雷明 2. 方梓涵 3. 黄少丹 4. 董翔云 5.曾丽莉 6. 詹鑫冰 7.鲍凌函 8.杜筱 9.曹兰英 10. 吴沅静 1.3 冲刺成果展示 1 ...
- 毕设(1)——机械臂DH建模
目录 毕设(1)--机械臂DH建模 改进DH参数表 Matlab代码验证 毕设中用到了很多代码,其中一部分我通过看书和看论文学习并实现的代码,会通过Gitee仓库分享出来,这些代码仅用于学习使用,祝各 ...
- python基础学习10
python基础学习 内容概要 文件内光标的移动 文件数据修改 函数简介 函数语法结构 内容详情 文件内光标的移动 with open(r'路径','r',encoding='utf8') as f: ...
- python基础学习9
python基础学习 内容概要 字符编码的简介 字符编码的发展史 字符编码的实际应用 文件操作简介 文件读写模式 文件操作模式 文件操作方法 内容详情 字符编码的简介 # 字符编码主要研究的对象是文本 ...