更改粒子系统材质Unity 3D脚本

时间:2017-12-06 15:23:21

标签: c# unity3d particle-system

我正在尝试为我的对象创建粒子发射,这些对象实际上是国际象棋游戏中的棋子。我使用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");
    }

这就是它的样子:

enter image description here

编辑:

代码更改:

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");
    }

我的材料位置: enter image description here

材料检查员:

enter image description here

附加到对象的脚本:

enter image description here

2 个答案:

答案 0 :(得分:3)

问题在于这一行:Resources.GetBuiltinResource<Material>("BlackBishop.mat")

它返回null。 Resources.GetBuiltinResource函数用于加载Unity内置的资源,而不是由您创建的资源。例如,&#34; Sprites-Default.mat&#34; 。没有名为&#34; BlackBishop.mat&#34; 的内置素材,因此它返回null。

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

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

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

注意我没有包含&#34; .mat&#34;在名字里。使用Resources.Load功能时,您不会包含扩展名。如果你这样做,它将找不到它。

修改

  

但我的游戏场景仍然没有发生

请小心:

1 。就像我在原来的回答中所说,你必须创建一个名为&#34; Resources&#34; 的文件夹,并且必须将&#34; Black Bishop&#34; 材料放在该文件夹中。你没有这样做,它不应该工作。此文件夹的拼写必须正确,因此请直接从此答案中复制。同样,它应该命名为&#34; Resources&#34;

2 。您的资料名为&#34; Black Bishop&#34; 不是&#34; BlackBishop&#34; 。看到空间。请在代码中修复此问题。这应该是Resources.Load<Material>("Black Bishop"); 不是 Resources.Load<Material>("BlackBishop");

3 。您的素材目前正在使用&#34;标准&#34; 着色器。将其更改为“粒子着色器”。您可以通过选择材质并将着色器从&#34;标准&#34; 更改为&#34;粒子/ Alpha混合预乘&#34; 来实现。就是这样。你的问题现在应该解决了。

额外:

我注意到您正在使用文件夹来整理资源。你的&#34; Black Bishop.mat&#34; 在Arcane Cyber​​中 - &gt;国际象棋 - &gt;材料 - &gt;件 - &gt;塑料。我建议你移动&#34;材料&#34;文件夹到上面#1 中创建的&#34; Resources&#34; 文件夹。

现在,您的&#34; Black Bishop.mat&#34; 应位于资产内 - &gt;资源 - &gt;材料 - &gt;件 - &gt;塑料。

您现在可以将其加载为:

Resources.Load<Material>("Materials/Pieces/Plastic/Black Bishop");

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

答案 1 :(得分:0)

为什么不使用您需要的材料制作一个 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();