You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity3D技术问题:如何用ParticleSystem与OnCollisionEnter实现玩家点燃火把

实现玩家点燃火把的功能方案

别担心,咱们把这个需求拆成几个简单的步骤来做,很快就能搞定!核心就是标记火把状态、检测碰撞/交互触发、控制粒子系统启停这三块,一步步来:


第一步:给火把预制体加状态管理脚本

先给你的火把预制体写个小脚本,用来管它“点没点燃”,以及控制粒子系统的播放:

using UnityEngine;

public class Torch : MonoBehaviour
{
    // 在Inspector里拖入你的火把粒子系统组件
    [SerializeField] private ParticleSystem fireParticles;
    // 标记当前火把是否已点燃
    private bool isLit = false;

    void Start()
    {
        // 初始时关闭粒子系统,确保没残留粒子
        if (fireParticles != null)
        {
            fireParticles.Stop();
            fireParticles.Clear();
        }
    }

    // 对外公开的点燃方法,让外部脚本调用
    public void LightTorch()
    {
        if (!isLit && fireParticles != null)
        {
            isLit = true;
            fireParticles.Play();
            // 这里还能加点火音效、开启火把灯光之类的额外效果
        }
    }

    // 供外部判断火把状态的方法
    public bool IsTorchLit()
    {
        return isLit;
    }
}

把这个脚本挂到火把预制体上,记得在面板里把ParticleSystem拖到fireParticles的赋值框里,同时把粒子系统的Play On Awake取消勾选哦。


第二步:给玩家手持的火把加触发逻辑

分两种常见场景来实现,你按需选:

场景1:自动碰撞点燃

给玩家手持的火把加一个Sphere Collider(或者你觉得合适的碰撞体),勾选Is Trigger,然后加这个脚本:

using UnityEngine;

public class PlayerTorch : MonoBehaviour
{
    void OnTriggerEnter(Collider other)
    {
        // 检测碰到的是不是未点燃的火把
        Torch targetTorch = other.GetComponent<Torch>();
        if (targetTorch != null && !targetTorch.IsTorchLit())
        {
            targetTorch.LightTorch();
            // 可以加个点火的音效反馈
        }
    }
}

场景2:玩家主动按键触发(比如按E)

如果需要玩家靠近后按特定键才点燃,就用这个脚本:

using UnityEngine;

public class PlayerTorchInteract : MonoBehaviour
{
    private Torch currentNearbyTorch;

    void Update()
    {
        // 按E键触发点燃
        if (Input.GetKeyDown(KeyCode.E) && currentNearbyTorch != null && !currentNearbyTorch.IsTorchLit())
        {
            currentNearbyTorch.LightTorch();
            currentNearbyTorch = null;
        }
    }

    void OnTriggerEnter(Collider other)
    {
        Torch torch = other.GetComponent<Torch>();
        if (torch != null && !torch.IsTorchLit())
        {
            currentNearbyTorch = torch;
            // 这里可以显示UI提示:"按E点燃火把"
        }
    }

    void OnTriggerExit(Collider other)
    {
        Torch torch = other.GetComponent<Torch>();
        if (torch == currentNearbyTorch)
        {
            currentNearbyTorch = null;
            // 隐藏提示UI
        }
    }
}

第三步:几个关键注意点

  • 所有火把对象都要加Rigidbody(触发事件要求至少一方有Rigidbody),可以勾选Is Kinematic,避免火把乱跑。
  • 如果需要火把点燃后永久保持状态,可以用PlayerPrefs或者场景存档逻辑保存状态,不然场景加载后会重置。
  • 要是粒子系统播放有问题,检查一下粒子系统的Loop是否勾选,以及初始的Stop和Clear有没有生效。

这样一步步下来,就能实现你要的功能啦~

内容的提问来源于stack exchange,提问作者dlm43

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:14:58