首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FlexArray Flex:为什么我不能在Nvidia执行器中设置粒子计数?(统一)

FlexArray Flex:为什么我不能在Nvidia执行器中设置粒子计数?(统一)
EN

Stack Overflow用户
提问于 2019-02-08 13:44:36
回答 1查看 379关注 0票数 0

我是新手在C#中编码,我不能在Nvidia FlexArray脚本中设置粒子计数,粒子计数公共类显示为灰色并且无法编辑。它以某种方式永久设置为0。

我已经附上了一个图像和脚本,随包而来。非常感谢您的帮助。The image for the inspector view on array actor

代码语言:javascript
复制
using UnityEngine;

namespace NVIDIA.Flex
{
    [ExecuteInEditMode]
    public class FlexArrayAsset : FlexAsset
    {
        #region Properties

        public Mesh boundaryMesh
        {
            get { return m_boundaryMesh; }
            set { m_boundaryMesh = value; }
        }

        public Vector3 meshLocalScale
        {
            get { return m_meshLocalScale; }
            set { m_meshLocalScale = value; }
        }

        public float meshExpansion
        {
            get { return m_meshExpansion; }
            set { m_meshExpansion = value; }
        }

        public float particleSpacing
        {
            get { return m_particleSpacing; }
            set { m_particleSpacing = Mathf.Max(value, 0.01f); }
        }
        public float particleCount
        {
            get { return m_particleCount; }
            set { m_particleCount = Mathf.Max(value, 516f); }
        }
        
        #endregion

        #region Methods


        #endregion

        #region Messages


        #endregion

        #region Protected

        protected override void ValidateFields()
        {
            base.ValidateFields();
            m_particleSpacing = Mathf.Max(m_particleSpacing, 0.01f);
        }

        protected override void RebuildAsset()
        {
            BuildFromMesh();
            base.RebuildAsset();
        }

        #endregion

        #region Private

        void BuildFromMesh()
        {
            if (m_boundaryMesh)
            {
                Vector3[] vertices = m_boundaryMesh.vertices;
                if (vertices != null && vertices.Length > 0)
                {
                    for (int i = 0; i < vertices.Length; ++i)
                    {
                        Vector3 v = vertices[i];
                        vertices[i] = new Vector3(v.x * m_meshLocalScale.x, v.y * m_meshLocalScale.y, v.z * m_meshLocalScale.z);
                    }
                    int[] indices = m_boundaryMesh.triangles;
                    if (indices != null && indices.Length > 0)
                    {
                        FlexExt.Asset.Handle assetHandle = FlexExt.CreateRigidFromMesh(ref vertices[0], vertices.Length, ref indices[0], indices.Length, m_particleSpacing, m_meshExpansion);
                        if (assetHandle)
                        {
                            FlexExt.Asset asset = assetHandle.asset;
                            FlexExt.Asset particlesOnly = new FlexExt.Asset();
                            particlesOnly.numParticles = asset.numParticles;
                            particlesOnly.maxParticles = asset.numParticles;
                            particlesOnly.particles = asset.particles;
                            StoreAsset(particlesOnly);

                            FlexExt.DestroyAsset(assetHandle);
                        }
                    }
                }
            }
        }

        [SerializeField]
        Mesh m_boundaryMesh = null;
        [SerializeField]
        Vector3 m_meshLocalScale = Vector3.one;
        [SerializeField, Tooltip("Particles will be moved inwards (if negative) or outwards (if positive) from the surface of the mesh according to this factor")]
        float m_meshExpansion = 0.0f;
        [SerializeField, Tooltip("The spacing used for voxelization, note that the number of voxels grows proportional to the inverse cube of radius, currently this method limits construction to resolutions < 64^3")]
        float m_particleSpacing = 0.1f;

        #endregion
    }
}

EN

回答 1

Stack Overflow用户

发布于 2019-02-08 14:23:53

属性不能在Unity中直接序列化。

推荐的流程是将m_particleCount标记为SerializeField,这会将其公开给编辑器,即使它是私有的。

但它看起来可能被Flex API埋没了,所以我不确定您是否可以直接编辑它。在这种情况下,一个更复杂的编辑器脚本就可以完成这项工作,我建议您尝试使用自己的值来破解该值,然后使用OnValidate()将该值写入真正的值。

也就是说,这个值真的和你想的一样吗?我没有用过这个接口,但'particleCount‘通常是系统中活动粒子的数量,在编辑时它自然会是0,但在运行时它可能是10、20或1000,这取决于粒子系统正在做什么。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54586632

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档