rabidus-test/Assets/trail/scripts/Trail_manager.cs

84 lines
3.3 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Trail_manager : MonoBehaviour
{
[Header("target SkinnedMeshRenderer")]
public GameObject game_obj_target;
//The position of the previous target----------之前目标物体的位置
private Vector3 v3_position_game_obj_target_before;
[Header("how many trails-------定义多少个尾巴")]
public int trail_count;
[Header("The initial transparency of the tail------尾巴的初始透明度")]
[Range(0f, 1f)]
public float trail_alpha;
[Header("The time between each tail, in seconds---------每个尾巴间隔的时间,单位秒")]
public float trail_interval_time;
[Header("The speed at which each tail disappears------每个尾巴消失的速度")]
public float trail_disappear_speed;
[Header("Trail Color")]
[ColorUsageAttribute(true, true, 0f, 8f, 0.125f, 3f)]
public Color color_trail;
// Start is called before the first frame update
void Start()
{
if (this.trail_count > 0 && this.game_obj_target != null && this.game_obj_target.activeInHierarchy == true)
{
//Generate trail objects--------生成trail物体
for (int i = 0; i < this.trail_count; i++)
{
GameObject trail = new GameObject("trail" + i);
trail.transform.SetParent(this.transform);
trail.AddComponent<MeshFilter>();
trail.AddComponent<MeshRenderer>();
trail.GetComponent<MeshRenderer>().shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off; //no shadow
Material mat = new Material(Shader.Find("EasyGameStudio/trail"));
mat.SetTexture("main_texture", this.game_obj_target.GetComponent<SkinnedMeshRenderer>().material.mainTexture);
mat.SetColor("color_fresnel_emission", this.color_trail);
trail.GetComponent<MeshRenderer>().material = mat;
Trail_control trail_control = trail.AddComponent<Trail_control>();
trail.SetActive(false);
}
StartCoroutine(this.trail_start());
}
}
//The coroutine starts to make the tail----------协程开始制作尾巴
IEnumerator trail_start()
{
while (true)
{
for (int i = 0; i < this.trail_count; i++)
{
//If the position does not change, the tail will not be set--------位置没有变的话 就不设置尾巴
if (this.v3_position_game_obj_target_before != this.game_obj_target.transform.position)
{
GameObject trail = this.transform.GetChild(i).gameObject;
trail.transform.position = this.game_obj_target.transform.position;
trail.transform.rotation = this.game_obj_target.transform.rotation;
if (trail.activeSelf == false)
trail.SetActive(true);
trail.GetComponent<Trail_control>().init(this.trail_disappear_speed, this.game_obj_target.GetComponent<SkinnedMeshRenderer>(), this.trail_alpha);
}
this.v3_position_game_obj_target_before = this.game_obj_target.transform.position;
yield return new WaitForSeconds(this.trail_interval_time);
}
}
}
}