完整代码
cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CoinColoneManager : MonoBehaviour
{
// 这个脚本用来检测金币触发区,一旦触发就在前方指定位置克隆金币
// 首先做触发检测 OnEnterTrigger(), // 用克隆函数 开始克隆5个金币在指定坐标上
public GameObject CoinMuban; // 金币的模板对象,用于克隆生成新的金币
public GameObject CoinPoint01; // 第一个金币生成点
public GameObject CoinPoint02; // 第二个金币生成点
public GameObject CoinParent; // 用于管理克隆出的金币对象的父对象,方便统一管理
private void Start()
{
// 初始化代码可以放在这里
}
private void OnCollisionEnter(Collision collision)
{
// 当物体发生碰撞时调用此方法
if (collision.gameObject.name == "CollRoad1")
{
// 如果玩家碰到了名为 "CollRoad1" 的碰撞器
Debug.Log("玩家碰到了列车01碰撞器,开始克隆金币");
CloneCoin(CoinPoint01); // 在第一个生成点克隆金币
}
if (collision.gameObject.name == "Collider02")
{
// 如果玩家碰到了名为 "Collider02" 的碰撞器
CloneCoin(CoinPoint02); // 在第二个生成点克隆金币
Debug.Log("玩家碰到了列车02碰撞器,开始克隆金币2");
}
}
void CloneCoin(GameObject TempObj)
{
// 这个函数负责克隆金币
for (int i = 0; i < 8; i++)
{
// 计算每个金币的位置,z 坐标每次增加 2,确保金币在 z 轴上均匀分布
Vector3 TempPos = new Vector3(TempObj.transform.position.x, TempObj.transform.position.y, TempObj.transform.position.z + i * 2);
// 克隆金币对象,并将其父对象设置为 CoinParent
GameObject.Instantiate(CoinMuban, TempPos, Quaternion.identity, CoinParent.transform);
}
}
}
代码详解
1. 引入必要的命名空间
csharp
复制
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
这部分代码引入了Unity开发中常用的命名空间,确保我们可以使用Unity提供的各种类和方法。
2. 定义 CoinColoneManager
类
csharp
复制
public class CoinColoneManager : MonoBehaviour
{
// 这个脚本用来检测金币触发区,一旦触发就在前方指定位置克隆金币
// 首先做触发检测 OnEnterTrigger(), // 用克隆函数 开始克隆5个金币在指定坐标上
public GameObject CoinMuban; // 金币的模板对象,用于克隆生成新的金币
public GameObject CoinPoint01; // 第一个金币生成点
public GameObject CoinPoint02; // 第二个金币生成点
public GameObject CoinParent; // 用于管理克隆出的金币对象的父对象,方便统一管理
-
CoinColoneManager
类继承自MonoBehaviour
,这是Unity中所有脚本的基类。 -
CoinMuban
:金币的模板对象,用于克隆生成新的金币。 -
CoinPoint01
和CoinPoint02
:两个预设的生成点,分别用于在不同位置生成金币。 -
CoinParent
:用于管理克隆出的金币对象的父对象,方便统一管理。
3. Start
方法
csharp
复制
private void Start()
{
// 初始化代码可以放在这里
}
Start
方法在脚本第一次激活时调用,通常用于初始化操作。在这个例子中,我们没有在 Start
方法中添加任何代码。
4. OnCollisionEnter
方法
csharp
复制
private void OnCollisionEnter(Collision collision)
{
// 当物体发生碰撞时调用此方法
if (collision.gameObject.name == "CollRoad1")
{
// 如果玩家碰到了名为 "CollRoad1" 的碰撞器
Debug.Log("玩家碰到了列车01碰撞器,开始克隆金币");
CloneCoin(CoinPoint01); // 在第一个生成点克隆金币
}
if (collision.gameObject.name == "Collider02")
{
// 如果玩家碰到了名为 "Collider02" 的碰撞器
CloneCoin(CoinPoint02); // 在第二个生成点克隆金币
Debug.Log("玩家碰到了列车02碰撞器,开始克隆金币2");
}
}
-
OnCollisionEnter
方法在物体发生碰撞时调用。 -
通过判断碰撞对象的名称,确定玩家碰到了哪个碰撞器。
-
如果玩家碰到了
CollRoad1
或Collider02
,则调用CloneCoin
方法,在指定位置生成金币。
5. CloneCoin
方法
csharp
复制
void CloneCoin(GameObject TempObj)
{
// 这个函数负责克隆金币
for (int i = 0; i < 8; i++)
{
// 计算每个金币的位置,z 坐标每次增加 2,确保金币在 z 轴上均匀分布
Vector3 TempPos = new Vector3(TempObj.transform.position.x, TempObj.transform.position.y, TempObj.transform.position.z + i * 2);
// 克隆金币对象,并将其父对象设置为 CoinParent
GameObject.Instantiate(CoinMuban, TempPos, Quaternion.identity, CoinParent.transform);
}
}
-
CloneCoin
方法用于克隆金币。 -
for
循环用于生成8个金币。 -
TempPos
计算每个金币的位置,z
坐标每次增加2
,确保金币在z
轴上均匀分布。 -
GameObject.Instantiate
方法用于克隆金币对象,并将其父对象设置为CoinParent
。
总结
通过这个简单的脚本,我们实现了在玩家碰到特定碰撞器时,在指定位置生成金币的功能。代码结构清晰,逻辑简单,适合初学者学习和理解。希望这篇文章能帮助你更好地理解Unity中的碰撞检测和对象克隆。
如果你有任何问题或建议,欢迎在评论区留言讨论!