【跑酷项目02】实现触发并在前方克隆金币

完整代码

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:金币的模板对象,用于克隆生成新的金币。

  • CoinPoint01CoinPoint02:两个预设的生成点,分别用于在不同位置生成金币。

  • 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 方法在物体发生碰撞时调用。

  • 通过判断碰撞对象的名称,确定玩家碰到了哪个碰撞器。

  • 如果玩家碰到了 CollRoad1Collider02,则调用 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中的碰撞检测和对象克隆。

如果你有任何问题或建议,欢迎在评论区留言讨论!

相关推荐
龚礼鹏24 分钟前
图像显示框架七——createSurface的流程(基于Android 15源码分析)
android
聆风吟º34 分钟前
【Spring Boot 报错已解决】Spring Boot项目启动报错 “Main method not found“ 的全面分析与解决方案
android·spring boot·后端
Rysxt_1 小时前
Kotlin前景深度分析:市场占有、技术优势与未来展望
android·开发语言·kotlin
莫白媛1 小时前
Android开发之Kotlin 在 Android 开发中的全面指南
android·开发语言·kotlin
broadview_java11 小时前
使用 ConstraintLayout 构建自适应界面
android
wy31362282115 小时前
android——开发中的常见Bug汇总与解决方案(闪退)
android·bug
小小测试开发15 小时前
实战派SQL性能优化:从语法层面攻克项目中的性能瓶颈
android·sql·性能优化
QuantumLeap丶16 小时前
《Flutter全栈开发实战指南:从零到高级》- 26 -持续集成与部署
android·flutter·ios
StarShip18 小时前
从Activity.setContentView()开始
android
千里马学框架18 小时前
重学SurfaceFlinger之Layer显示区域bounds计算剖析
android·智能手机·sf·安卓framework开发·layer·surfaceflinger·车载开发