当前位置: 首页 > article >正文

unity 粒子系统实现碰撞检测(collision)且使粒子不受力

需求:通过碰撞检测的方式,获得粒子碰撞到的物体,并且碰撞之后,粒子的运动方向,旋转等物理性质都保持不变

为什么不用trigger?因为trigger虽然不会使粒子受力,但是在触发回调函数中,只能够获得被触发的粒子,较难获得激活物体。

实现方式:

1.配置粒子系统

勾选Collision ,碰撞对象层级可以在Collides With上选择

如图,选择之后,粒子只能碰撞到 Layer为EnemyRoot的物体

我在网上搜索到文章说将设置都置0,并且不选择三个Multiply就可以使得粒子不受力,但是我尝试后还是不行,所以决定用代码的方式修改粒子,让其保持属性

2.代码

private ParticleSystem ps;
ParticleSystem.Particle oriParticle;//储存原始的粒子信息
ParticleSystem.Particle[] allParticles;//获得所释放的所有粒子

private void Start()
{
    ps = transform.GetComponent<ParticleSystem>();
    allParticles = new ParticleSystem.Particle[ps.main.maxParticles];
    StartCoroutine(RecordInitialRotation());
}

//获得初始的粒子信息
IEnumerator RecordInitialRotation()
{
    //间隔2s后再开始获取初始粒子信息,否则可能没有活跃粒子
    yield return new WaitForSeconds(2f);
    int activeCount = ps.GetParticles(allParticles);
    if (activeCount > 0) // 确保粒子系统中有粒子
    {
        oriParticle = allParticles[0];
    }
    else
    {
        Debug.LogWarning("粒子系统中没有活跃粒子,无法获取初始旋转值!");
    }

}

//发生粒子碰撞的回调函数,修改粒子的物理信息,使其碰撞后也不会改变位置
private void OnParticleCollision(GameObject other)
{
    print("被碰撞的物体名字是:"+other.name);
    int count = ps.GetParticles(allParticles);
    for(int i = 0; i < count; ++i)
    {
        //修改粒子,只保留当前位置
        oriParticle.position = allParticles[i].position;
        allParticles[i] = oriParticle;
    }
    //替换当前活跃的前count个粒子,一定要传入数目
    ps.SetParticles(allParticles, count);
}


http://www.kler.cn/a/519132.html

相关文章:

  • tmp记录
  • GESP2024年3月认证C++六级( 第三部分编程题(1)游戏)
  • Go中的三种锁
  • HTML从入门到精通:链接与图像标签全解析
  • 手撕B-树
  • 【FreeRTOS 教程 四】队列创建与发布项目到队列
  • tcp/ip协议和ip协议,tcp/ip协议 ip协议
  • 探索JavaScript:网页设计中的创意与实践
  • leetcode——翻转链表(java)
  • (回溯分割)leetcode93 复原IP地址
  • AI学习(vscode+deepseek+cline)
  • INMP441一款微型电容式麦克风(MEMS麦克风)
  • Zookeeper(28)Zookeeper的线性化写入和顺序一致性读是什么?
  • 代码随想录day4
  • 【论文推荐|深度学习,滑坡检测,多光谱影像,自然灾害,遥感】2022年Landslide4Sense竞赛成果:基于多源卫星影像的先进滑坡检测算法研究(一)
  • 手机app如何跳过无障碍权限实现弹框自动点击-ADB连接专题
  • Redis 详解
  • 开源智慧园区管理系统对比五款主流产品探索智能运营新模式
  • PCB布线注意事项(1)
  • 深度学习 | 表示学习 | 卷积神经网络|翻转卷积核是干啥呢|09
  • 搭建Spring Boot开发环境
  • hot100_141. 环形链表
  • 125周六复盘 (167)帧数优化
  • Blazor-选择循环语句
  • 奇怪的单词(快速扩张200个单词)
  • 基于Matlab实现雷达目标特性相关仿真