【问题标题】:Change particle system material Unity 3D script更改粒子系统材质 Unity 3D 脚本
【发布时间】:2018-05-20 12:56:44
【问题描述】:

我正在尝试为我的对象创建粒子发射,这些对象实际上是国际象棋游戏中的棋子。我使用 Inspector 为粒子系统更改了粒子材质,它工作正常,但是,当我尝试使用脚本更改它时,什么也没有发生(黑色棋子的粒子保持粉红色)。

我不确定脚本有什么问题,是否是材质更改问题,或者我需要设置材质路径。如果有人提出解决方案,我会很高兴!

这是脚本:

public class BlackPawnParticleSystem : MonoBehaviour 
{
    private Material m_Material;
    private ParticleSystemRenderer psr;

    private void Start() 
    {
        var ps     = GetComponent<ParticleSystem>();
        m_Material = GetComponent<Renderer>).material;
        psr        = GetComponent<ParticleSystemRenderer>);

        psr.material = Resources.GetBuiltinResource<Material>("BlackBishop.mat");
    }

看起来是这样的:

编辑:

代码变化:

public class BlackPawnParticleSystem : MonoBehaviour 
{
    private Material m_Material;
    private ParticleSystemRenderer psr;

    private void Start() 
    {
        var ps       = GetComponent<ParticleSystem>();
        m_Material   = GetComponent<Renderer>().material;
        psr          = GetComponent<ParticleSystemRenderer>();
        psr.material = Resources.Load<Material>("BlackBishop");
    }

我的材料的位置:

材料检查员:

附加到对象的脚本:

【问题讨论】:

  • 我猜这与将材质设置在实际上并不指向ParticleSystem 的对象上有关。 Unity 暴露 ParticleSystem 对象的方式很奇怪,我会研究一下。
  • 我还会检查GetBuiltinResource是否返回null,这会导致粉红色颗粒。

标签: c# unity3d particle-system


【解决方案1】:

问题出在这一行:Resources.GetBuiltinResource&lt;Material&gt;("BlackBishop.mat")

它返回空值。 Resources.GetBuiltinResource 函数用于加载 Unity 内置的资源,而不是您创建的资源。例如,“Sprites-Default.mat”。没有名为 "BlackBishop.mat" 的内置材质,因此它返回 null。


要加载您创建的材料,请使用 rhe Resources.Load 函数。

首先,创建一个名为“Resources”的文件夹,然后将“BlackBishop.mat”材料放在那里。您现在可以按如下方式加载它:

Resources.Load<Material>("BlackBishop");

请注意我没有在名称中包含“.mat”。使用 Resources.Load 函数时不包括扩展名。如果你这样做,它不会找到它。

编辑

但我的游戏场景仍然没有任何反应

请小心:

1。就像我在原始答案中所说,您必须创建一个名为 “Resources” 的文件夹,并且必须将 文件夹内的“黑主教”材料。你还没有这样做,它不应该工作。此文件夹的拼写必须正确,因此请直接从此答案中复制。同样,它应该被命名为“资源”

2.您的材料被命名为 "Black Bishop" 而不是 "BlackBishop" 。见空间。请在代码中解决此问题。那应该是Resources.Load&lt;Material&gt;("Black Bishop"); 不是 Resources.Load&lt;Material&gt;("BlackBishop");

3.您的材质当前正在使用“标准” 着色器。将其更改为粒子着色器。您可以通过选择材质并将着色器从 "Standard" 更改为 "Particles/Alpha Blended Premultiply" 来实现。而已。您的问题现在应该已经解决了。

额外:

我注意到您正在使用文件夹来组织您的资源。您的 “Black Bishop.mat” 位于 Arcane Cyber​​ --> Chess --> Materials --> Pieces --> Plastic。建议您将“Materials”文件夹移动到上面#1中创建的“Resources”文件夹中。

现在,您的 “Black Bishop.mat” 应该位于 Assets --> Resources --> Materials --> Pieces --> Plastic。

您现在可以将其加载为:

Resources.Load&lt;Material&gt;("Materials/Pieces/Plastic/Black Bishop");

如果您仍有问题,请再次更新您的代码和新的 Inspector 图像。记住拼写很重要。

【讨论】:

  • 感谢您提供这样的解决方案。但是我的游戏场景仍然没有任何反应
  • 粒子还是粉红色的吗?如果没有,那么问题就解决了。为您的其他问题创建新问题
  • 是的,还是粉红色的
  • 1.将“EDIT*”添加到您的问题中,然后添加您的新代码。2.还显示一个屏幕截图,显示您放置要加载的材料的位置。3.最后,选择材料并发布它的检查器的屏幕截图。我想看看设置。有了所有这些,我可以很容易地告诉你你在哪里搞砸了。
  • 2.我想看看你放材料的文件夹。它没有显示,因为您在搜索栏中有一些东西。清除 Unity 搜索栏。转到该材料所在的位置,选择该材料并对其拍照。 2.我要求的是材料检查器选项卡的屏幕截图,而不是粒子系统检查器选项卡。选择 BlackBishop 材料,然后给它的 Inspector 拍照。
【解决方案2】:

为什么不用您需要的材料制作一个 SerializedField?如果您不希望材料和轨迹是随机的,请将它们设置为您需要的阵列中的确切位置。

我是这样做的:

using UnityEngine;

public class CorrectParticles : MonoBehaviour
{
    private static ParticleSystem correctPart;
    private static ParticleSystemRenderer correctRend;

    public static CorrectParticles Instace;

    [SerializeField] Material[] mainMaterials;
    [SerializeField] Material[] trailMaterials;

    private void Awake()
    {
        Instace = this;
    }

    void Start()
    {
        correctPart = GetComponent<ParticleSystem>();
        correctRend = GetComponent<ParticleSystemRenderer>();
        correctPart.Stop();
    }

    public void StartParticles()
    {
        int mainMaterial = Random.Range(0, mainMaterials.Length);
        correctRend.material = mainMaterials[mainMaterial];

        int trailMaterial = Random.Range(0, trailMaterials.Length);
        correctRend.trailMaterial = trailMaterials[trailMaterial];
        
        correctPart.Play();
    }

    public void StopParticles()
    {
        correctPart.Stop(withChildren: true, stopBehavior: ParticleSystemStopBehavior.StopEmittingAndClear);
    }
}

然后我可以根据需要在其他脚本上启动和停止粒子系统。

CorrectParticles.Instace.StartParticles();

CorrectParticles.Instace.StopParticles();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多