Unity核心概率⑤:GameObject

一、GameObject中的成员变量

1.名字:

//使用小写 gameObject 访问当前对象
print(this.gameObject.name);

//设置当前物体名称为"名字"
this.gameObject.name = "名字";

// 打印变量值
print(this.gameObject.name);

2.是否激活:

print(this.gameObject.activeSelf);

3.是否是静态:

print(this.gameObject.isStatic);

4.层级:

print(this.gameObject.layer);

5.标签:

print(this.gameObject.tag);

6.transform:

print(this.gameObject.transform.position);

Unity核心概率④:MonoBehavior-CSDN博客中提到的通过MonoBehavior去得到依附对象的GameObject位置信息,他们得到的信息是一样的。

二、GameObject中的静态方法

只要得到了一个GameObject对象,我们就可以得到它身上挂载的任何脚本信息。

1.创建unity自带的几何体

// 创建一个立方体原始游戏对象
GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Cube);

// 将该对象的名称设置为"立方体"
obj.name = "立方体";

2.查找对象相关

①查找单个对象

通过对象名查找:

注意:这个查找方法效率比较低下,因为它会在场景中的所以对象中去查找。

// 在场景中查找名为"对象"的游戏对象
GameObject obj = GameObject.Find("对象");

// 检查是否成功找到该游戏对象
if(obj != null)
{
    // 如果找到,打印该游戏对象的名称
    print(obj.name);
}
else
{
    // 如果未找到,打印提示信息
    print("没有找到对象");
}
通过tag查找:
// 通过标签"player"在场景中查找对应的游戏对象
GameObject obj = GameObject.FindWithTag("player");

// 检查是否成功找到对象
if(obj != null)
{
    // 如果找到对象,打印成功信息和该对象的名称    
    print("根据tag找到对象" + obj.name); 
}
else
{
    // 如果没有找到对应标签的对象,打印未找到信息
    print("根据tag没有找到对象");
}

得到某一个单个对象,目前有两种方法:一种是public从外部面板进行关联;另一种是通过API去找。

②查找多个对象:

找多个对象的API只能是通过tag去找多个,没有通过名字找多个的方法。通过tag找多个对象也是只能找到激活的对象,无法找到失活对象。

// 在场景中查找所有标签为"player"的游戏对象
// 返回一个包含所有匹配对象的数组
GameObject[] objs = GameObject.FindGameObjectsWithTag("player");

// 打印找到的对象数量
print("找到tag为player对象的个数为" + objs.Length);

注意:

“万物之父” 指的是 C# 语言中的所有类型的终极基类——System.Object 类。Unity中的Object和C#中的有区别。

Unity中的Object不是指的是万物之父Object,它的命名空间在UnityEngine中的Object类,是集成万物之父的一个自定义类。

C#中的Object的命名空间在System中。

3.找场景中挂载的某一个脚本对象

// 在场景中查找第一个激活的 Test 类型组件
Test foundTest = GameObject.FindObjectOfType<Test>();

// 安全检查,确保找到组件后再访问其属性
if(foundTest != null)
{
    // 打印该组件所在游戏对象的名称
    print(foundTest.gameObject.name);
}
else
{
    print("未找到 Test 类型的组件");
}

4.实例化对象(克隆对象)的方法

实例化(克隆)对象的作用是根据一个GameObject对象,创建出一个和它一模一样的对象。

GameObject.Instantiate(obj);

5.删除对象的方法

①:

GameObject.Destroy(obj);

②括号中第二个参数代表延迟几秒后删除:

GameObject.Destroy(obj,5);

③Destroy不仅可以删除对象,也可以删除脚本:

GameObject.Destroy(this.GameObject);

注意:Destroy方法不会马上移除对象,只是给这个对象加了个移除标识。一般情况下,它会在下一帧时把这个对象移除并从内存中删除。如果没有特殊要求,一定要马上移除一个对象的话,建议使用以上的Destroy方法,因为是异步的可以降低发生卡顿的几率。

 ④立即把对象从内存中移除:

GameObject.DestroyImmediate(obj);

如果是继承MonoBehavior的类,可以不用写GameObject:

Destroy(obj);
DestroyImmediate(obj);

⑤过场景不移除:

默认情况下,在切换场景时,场景中对象都会被自动删除。如果希望某个对象过场景不被删除,可以使用:

GameObject.DontDestroyOnLoad(this.gameObject);

如果是继承MonoBehavior的,也可以直接写:

DontDestroyOnLoad(this.gameObject);

三、常用的GameObject中的成员方法

1.创建空物体

new一个GameObject就是在创建一个空物体

// 创建一个名为"创建的空物体"的新游戏对象
GameObject obj = new GameObject("创建的空物体");

// 在创建的同时为其添加 Test 组件
// typeof(Test) 指定要添加的组件类型
GameObject obj = new GameObject("创建的空物体", typeof(Test));

2.为对象添加脚本

继承MonoBehavior的脚本,是不能去new。如果想要动态地添加继承MonoBehavior的脚本在某一个对象上,直接使用GameObject提供的方法即可:

// 通过Type添加组件并进行类型转换
// 在obj游戏对象上添加一个Test类型的组件
// AddComponent(typeof(Test)) 返回Component类型
// 使用 as 运算符将返回的Component安全转换为具体的Test类型
Test t = obj.AddComponent(typeof(Test)) as Test;

使用泛型方法更方便:

// 在游戏对象obj上添加一个Test类型的组件
// 方法会返回新添加的Test组件的引用,并直接赋值给变量t
Test t = obj.AddComponent<Test>();

通过返回值,可以得到加入的脚本信息来进行一些处理。得到的脚本成员的方法和继承MonoBehavior的类得到脚本的方法一致。

3.标签比较

以下两种方法是一样的:

if(this.gameObject.CompareTag("Player"))
{
    print("对象的标签是Player");
}
if(this.gameObject == "Player");
{
     print("对象的标签是Player");
}

4.设置激活或失活

激活:

obj.SetActive(true);

失活:

obj.SetActive(false);

四、次要的GameObject中的成员方法

这些方法了解即可,不建议使用,效率比较低下。

1.通过广播和发送消息的形式让自己或别人执行某些行为方法。

通知自己执行什么行为,或命令自己执行Plan这个函数,会在自己身上挂载的所有脚本中去找这个名字的函数,有这个名字的函数就去执行。

// 向当前游戏对象发送名为"Plan"的消息
// 会调用该对象上所有脚本中名为 Plan 的无参数方法
// 如果找不到对应方法,会输出警告
this.gameObject.SendMessage("Plan");

// 向当前游戏对象发送名为"Plan"的消息,并传递一个整数参数 199
// 会调用该对象上所有脚本中名为 Plan 且接受一个参数的方法
// 参数类型必须匹配(这里需要方法接受 int 类型参数)
this.gameObject.SendMessage("Plan", 199);

2.广播行为:让自己和自己的子对象执行。

this.gameObject.BroadcastMessage("函数名");

3.向父对象和自己发送消息并执行。

this.gameObject.SendMessageUpwards("函数名");
### 弹珠抽奖功能实现思路 在 Unity 中实现弹珠抽奖功能,可以通过模拟弹珠滚动、碰撞以及最终落入指定区域的逻辑来完成。以下是实现该功能的核心步骤与代码示例。 #### 1. 场景搭建 首先需要设计一个包含弹珠路径和奖品区域的场景。可以使用 Unity 的 `GameObject` 和 `Collider` 来定义路径和奖品区域[^1]。 ```csharp // 创建场景中的基础对象 public class SceneSetup : MonoBehaviour { public GameObject ballPrefab; // 弹珠预制体 public Transform spawnPoint; // 弹珠生成点 public List<GameObject> prizeAreas; // 奖品区域列表 void Start() { // 动态创建弹珠 Instantiate(ballPrefab, spawnPoint.position, Quaternion.identity); } } ``` #### 2. 弹珠运动逻辑 通过物理引擎控制弹珠的运动,包括重力、摩擦力和碰撞检测。可以为弹珠添加刚体组件 `Rigidbody` 并编写脚本来控制其初始速度和方向[^2]。 ```csharp // 弹珠运动控制 public class BallMovement : MonoBehaviour { public Rigidbody rb; public float initialSpeed = 5f; void Start() { // 给弹珠施加初始速度 rb.AddForce(Vector3.forward * initialSpeed, ForceMode.Impulse); } void OnCollisionEnter(Collision collision) { // 检测碰撞并处理 if (collision.gameObject.CompareTag("PrizeArea")) { Debug.Log("Hit Prize Area: " + collision.gameObject.name); } } } ``` #### 3. 奖品区域与中奖概率 每个奖品区域应具有对应的概率值。可以通过数组存储概率,并随机生成结果以决定弹珠最终落入哪个区域[^2]。 ```csharp // 随机选择中奖区域 public class PrizeManager : MonoBehaviour { public int[] probabilities = { 10, 10, 10, 10, 10, 10, 10, 30 }; // 概率数组 public List<GameObject> prizeAreas; public int GetRandomIndex(int[] arr) { int sum = 0; for (int i = 0; i < arr.Length; i++) sum += arr[i]; int rand = Random.Range(1, sum + 1); int index = 0; while (rand > probabilities[index]) { rand -= probabilities[index]; index++; } return index; } void Start() { int winningIndex = GetRandomIndex(probabilities); Debug.Log("Winning Prize Area: " + prizeAreas[winningIndex].name); } } ``` #### 4. 显示中奖结果 当弹珠进入某个奖品区域时,触发显示中奖结果的逻辑。可以通过 UI 系统动态更新文本或动画效果[^1]。 ```csharp // 显示中奖结果 public class ResultDisplay : MonoBehaviour { public Text resultText; public void ShowResult(string prizeName) { resultText.text = "You Won: " + prizeName; } } ``` #### 5. 整合逻辑 将上述模块整合到主脚本中,确保弹珠运动、碰撞检测和结果显示能够协同工作。 ```csharp public class LotteryLogic : MonoBehaviour { public SceneSetup sceneSetup; public PrizeManager prizeManager; public ResultDisplay resultDisplay; void Update() { if (Input.GetKeyDown(KeyCode.Space)) { // 触发抽奖 int winningIndex = prizeManager.GetRandomIndex(prizeManager.probabilities); string prizeName = prizeManager.prizeAreas[winningIndex].name; resultDisplay.ShowResult(prizeName); } } } ``` ### 注意事项 - 确保场景中的物理参数(如摩擦力、重力)设置合理,以模拟真实的弹珠运动效果。 - 使用 `Collider` 和 `Tag` 来区分不同的奖品区域,便于检测碰撞。 - 调整概率数组以满足实际需求,确保中奖分布符合预期。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值