【问题标题】:Unity Tron like trail Particle SystemUnity Tron 像轨迹粒子系统
【发布时间】:2021-11-24 00:10:45
【问题描述】:

我正在尝试模仿我的玩家身后的轨迹,类似于在 tron 中。我目前正在使用粒子系统来创建这条轨迹,它工作正常。我希望这条轨迹能够与其他物体发生碰撞,然后我会在碰撞时破坏这些物体。我有碰撞工作,但是当物体与我的轨迹碰撞时,一些粒子会与轨迹的其余部分脱节。有没有办法检测碰撞但不让粒子受到其他物体的影响?

这是我的粒子系统设置,如果有人对我如何改进我这样做的方式有任何建议,那就太棒了。现在我只是在彼此之上渲染一堆圆圈,但我假设必须有更好的方法。

理想情况下,从长远来看,我希望能够为赛道制作这样的东西。

谢谢!

【问题讨论】:

  • 您也可以尝试使用LineRenderer,只需应用适当的纹理和高度即可。

标签: unity3d particle-system


【解决方案1】:

/经过数千年的搜索,我想出了这个, 生成部分是从那个人那里复制的:https://www.youtube.com/watch?v=BIKYK8qbdG0&t=4s shaderGraph 可用于使轨迹材质发光/

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TrailMeshGenerator : MonoBehaviour
{
[SerializeField] Transform followPos;    
[SerializeField] float height = 1f;
[SerializeField] float width = 0.001f;  
[SerializeField] float destroyTrailAfterSecond = 4f;  
[SerializeField] Material trailMaterial;    
[SerializeField] float  spawnDelay = 0.01f;


bool firstTime = true;
GameObject trail;
MeshFilter meshFilter;
MeshCollider meshCollider;
List<Vector3> verticesDef;
List<int> triangleDef;
bool isEven = true;
int x;
float currentSpawnTrailTime = 0;


const string addMeshstrName = "AddMesh";

public void SetFollowPos(Transform pos)
{
    followPos = pos;
}

void Start()
{
    InvokeRepeating(addMeshstrName, 0, spawnDelay);
}


private void AddMesh()
{
    MonoLine();
    if (currentSpawnTrailTime > destroyTrailAfterSecond)
    {
        RemoveMesh();
    }

}

void Update()
{
    currentSpawnTrailTime += Time.deltaTime;
}

private void MonoLine()
{
    Vector3[] vertices = null;
    int[] triangles = null;

    var backward = followPos.transform.position - (followPos.transform.forward);

    if (firstTime)
    {
        vertices = new Vector3[]
        {
            backward + (followPos.transform.right * -width),
            backward - (followPos.transform.right * -width),
            backward - (followPos.transform.right * -width) + followPos.transform.up * height,
            backward + (followPos.transform.right * -width) + followPos.transform.up * height,
        };

        triangles = new int[]
        {
            0, 2, 1,
            0, 3, 2,
        };

        trail = new GameObject();
        trail.tag = "Head Trails";
        trail.layer = LayerMask.NameToLayer("Trail");

        meshFilter = trail.AddComponent<MeshFilter>();
        trail.AddComponent<MeshRenderer>().material = trailMaterial;

        meshCollider = trail.AddComponent<MeshCollider>();
        meshCollider.sharedMesh = meshFilter.mesh;

        verticesDef = new List<Vector3>();
        triangleDef = new List<int>();

        foreach (var v in vertices)
            verticesDef.Add(v);
        foreach (var t in triangles)
            triangleDef.Add(t);

        meshFilter.mesh.vertices = vertices;
        meshFilter.mesh.triangles = triangles;

        isEven = false;
        firstTime = false;

        x = 4;
        return;

    }

    if (isEven)
    {
        verticesDef.Add(backward + (followPos.transform.right * -width));
        verticesDef.Add(backward - (followPos.transform.right * -width));
        verticesDef.Add(backward - (followPos.transform.right * -width) + followPos.transform.up * height);
        verticesDef.Add(backward + (followPos.transform.right * -width) + followPos.transform.up * height);

        //left face
        triangleDef.Add(x - 4); //0
        triangleDef.Add(x - 1); //3
        triangleDef.Add(x);     //4

        triangleDef.Add(x - 4); //0
        triangleDef.Add(x);     //4
        triangleDef.Add(x + 3); //7

        //top face
        triangleDef.Add(x - 4); //0
        triangleDef.Add(x + 3); //7
        triangleDef.Add(x + 2); //6

        triangleDef.Add(x - 4); //0
        triangleDef.Add(x + 2); //6
        triangleDef.Add(x - 3); //1

        //right face
        triangleDef.Add(x - 3); //5
        triangleDef.Add(x + 2); //10
        triangleDef.Add(x + 1); //9

        triangleDef.Add(x - 3); //5
        triangleDef.Add(x + 1); //9
        triangleDef.Add(x - 2); //6

        isEven = false;

    }
    else
    {
        verticesDef.Add(backward + (followPos.transform.right * -width) + followPos.transform.up * height);
        verticesDef.Add(backward - (followPos.transform.right * -width) + followPos.transform.up * height);
        verticesDef.Add(backward - (followPos.transform.right * -width));
        verticesDef.Add(backward + (followPos.transform.right * -width));

        //left face
        triangleDef.Add(x - 4); //0
        triangleDef.Add(x + 3); //7
        triangleDef.Add(x);     //4

        triangleDef.Add(x - 4); //0
        triangleDef.Add(x);     //4
        triangleDef.Add(x - 1); //3

        //top face
        triangleDef.Add(x - 2); //2
        triangleDef.Add(x - 1); //3
        triangleDef.Add(x);     //4

        triangleDef.Add(x - 2); //2
        triangleDef.Add(x);     //4
        triangleDef.Add(x + 1); //5

        //right face
        triangleDef.Add(x - 3); //5
        triangleDef.Add(x - 2); //6
        triangleDef.Add(x + 1); //9

        triangleDef.Add(x - 3); //5
        triangleDef.Add(x + 1); //9
        triangleDef.Add(x + 2); //10

        isEven = true;
    }
    x += 4;
    
    meshFilter.mesh.vertices = verticesDef.ToArray();
    meshFilter.mesh.triangles = triangleDef.ToArray();

    meshCollider.sharedMesh = meshFilter.mesh;

   // Debug.Log(x +" bounds->" +meshFilter.mesh.bounds.size.magnitude);
    
}

private void RemoveMesh()
{
    verticesDef.RemoveAt(0);     
    verticesDef.RemoveAt(0);     
    verticesDef.RemoveAt(0);     
    verticesDef.RemoveAt(0);

    triangleDef.RemoveAt(triangleDef.Count - 1);
    triangleDef.RemoveAt(triangleDef.Count - 1);
    triangleDef.RemoveAt(triangleDef.Count - 1);

    triangleDef.RemoveAt(triangleDef.Count - 1);
    triangleDef.RemoveAt(triangleDef.Count - 1);
    triangleDef.RemoveAt(triangleDef.Count - 1);

    triangleDef.RemoveAt(triangleDef.Count - 1);
    triangleDef.RemoveAt(triangleDef.Count - 1);
    triangleDef.RemoveAt(triangleDef.Count - 1);

    triangleDef.RemoveAt(triangleDef.Count - 1);
    triangleDef.RemoveAt(triangleDef.Count - 1);
    triangleDef.RemoveAt(triangleDef.Count - 1);

    triangleDef.RemoveAt(triangleDef.Count - 1);
    triangleDef.RemoveAt(triangleDef.Count - 1);
    triangleDef.RemoveAt(triangleDef.Count - 1);

    triangleDef.RemoveAt(triangleDef.Count - 1);
    triangleDef.RemoveAt(triangleDef.Count - 1);
    triangleDef.RemoveAt(triangleDef.Count - 1);

    meshFilter.mesh.Clear();

    meshFilter.mesh.vertices = verticesDef.ToArray();
    meshFilter.mesh.triangles = triangleDef.ToArray();

    x -= 4;

}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多