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

2D游戏中玩家粒子系统翻转逻辑异常问题求助

问题描述

在2D游戏中,我给玩家挂载了Particle System,玩家左右转向时通过翻转缩放实现,用布尔值isFacingRight记录朝向。由于粒子系统有特定形状,我选择通过旋转而非翻转调整它的朝向:

  • 朝右时设置旋转为Quaternion.Euler(0, 0, 0)
  • 朝左时设置为Quaternion.Euler(0, 0, 165)

但出现两个问题:

  1. 朝左时粒子向下发射,不符合预期
  2. 若在粒子动画未结束时转回朝右,已发射的粒子仍保持朝左角度,但会变成直线发射,我需要粒子始终只使用两种固定发射角度(朝右对应0度,朝左对应正确角度)

当前代码如下:

if(!isFacingRight )
{
    particles.transform.rotation = Quaternion.Euler(0, 0, 165);
}
else 
{
    particles.transform.rotation = Quaternion.Euler(0, 0, 0);
}
particles.Play();

if((!isFacingRight && horizontal >0f) || (isFacingRight && horizontal < 0f)) 
{
    isFacingRight = !isFacingRight;
    Vector3 localScale = transform.localScale;
    localScale.x *= -1f;
    transform.localScale = localScale;
}
解决方法

1. 修正朝左时的发射角度

你设置的165度旋转会让粒子朝左下发射,这就是向下的原因。根据需求调整角度即可:比如想要纯左发射用180度,想要左上方发射可以用135度,按需微调。

2. 避免转向时粒子角度混乱

Unity粒子默认以世界空间发射,修改粒子系统transform旋转时,已发射的粒子不会跟着改变方向,导致新旧粒子角度混合。以下是两种可行方案:

方案一:动态修改粒子初始旋转(推荐)

不要直接修改粒子系统的transform旋转,而是通过代码调整粒子的初始旋转参数,确保新发射的粒子始终使用当前朝向对应的角度:

// 获取粒子系统的主模块
var mainModule = particles.main;
// 调整初始旋转角度
if(!isFacingRight)
{
    // 替换为你需要的朝左发射角度
    mainModule.startRotation = Quaternion.Euler(0, 0, 180);
}
else
{
    mainModule.startRotation = Quaternion.Euler(0, 0, 0);
}
particles.Play();

// 转向逻辑保持不变
if((!isFacingRight && horizontal > 0f) || (isFacingRight && horizontal < 0f)) 
{
    isFacingRight = !isFacingRight;
    Vector3 localScale = transform.localScale;
    localScale.x *= -1f;
    transform.localScale = localScale;
}

这样新发射的粒子会自动使用当前设置的初始角度,已发射的粒子保持发射时的方向,不会出现突变。

方案二:转向时清除旧粒子

如果要求转向时所有粒子都切换为新角度,可在转向时停止粒子系统并清除旧粒子,再重新播放:

// 播放粒子的逻辑
if(!isFacingRight )
{
    particles.transform.rotation = Quaternion.Euler(0, 0, 180); // 替换为正确角度
}
else 
{
    particles.transform.rotation = Quaternion.Euler(0, 0, 0);
}
particles.Play();

// 转向逻辑修改
if((!isFacingRight && horizontal > 0f) || (isFacingRight && horizontal < 0f)) 
{
    isFacingRight = !isFacingRight;
    Vector3 localScale = transform.localScale;
    localScale.x *= -1f;
    transform.localScale = localScale;
    
    // 停止并清除所有已发射粒子
    particles.Stop(true, ParticleSystemStopBehavior.StopEmittingAndClear);
    // 重新设置旋转并播放
    if(!isFacingRight)
    {
        particles.transform.rotation = Quaternion.Euler(0, 0, 180);
    }
    else
    {
        particles.transform.rotation = Quaternion.Euler(0, 0, 0);
    }
    particles.Play();
}

这种方式会清除旧粒子,只保留转向后新发射的粒子,确保所有粒子角度统一。

内容的提问来源于stack exchange,提问作者swag money wizz jizz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 09:25:56