using System.Collections; using System.Collections.Generic; using UnityEngine; /// /// 热力图生成脚本,根据目标对象位置生成热力图 /// [ExecuteInEditMode] public class QuadScript : MonoBehaviour { Material mMaterial; // 热力图材质 MeshRenderer mMeshRenderer; // 网格渲染器 float[] mPoints; // 存储热力图点数据数组,每个点包含x,y坐标和强度值 // 自动识别父级下所有子物体(不包含自身),并在Inspector中只读显示 [Header("自动识别的子物体(只读)")] [SerializeField] public Transform[] targetObjects; //暴露随机强度值的范围,默认为1到3 public float 热力图强度范围最小值 = 1f; // 最小强度值 public float 热力图强度范围最大值 = 3f; // 最大强度值 int mHitCount; // 当前热力点计数 float mDelay; // 延迟时间(未使用) /// /// 初始化热力图数据 /// void Start() { mDelay = 3; // 初始化延迟时间 // 获取材质和渲染器组件 mMeshRenderer = GetComponent(); mMaterial = mMeshRenderer.sharedMaterial; // 初始化热力点数组,支持128个点,每个点3个值(x,y坐标和强度) mPoints = new float[128 * 3]; // 自动识别所有子物体(不包含自身) List children = new List(); foreach (Transform t in transform) { if (t != transform) children.Add(t); } targetObjects = children.ToArray(); if(targetObjects.Length > 0) { foreach(Transform target in targetObjects) { if(target != null) { int index = Mathf.Min(mHitCount, 127); mPoints[index * 3] = target.position.x; mPoints[index * 3 + 1] = target.position.z; mPoints[index * 3 + 2] = Random.Range(热力图强度范围最小值, 热力图强度范围最大值); mHitCount++; } } } else { Debug.LogWarning("No child objects found for heatmap."); } } /// /// 每帧更新热力点位置 /// void Update() { // 持续更新热力图点位置 // 自动识别所有子物体(不包含自身) List children = new List(); foreach (Transform t in transform) { if (t != transform) children.Add(t); } targetObjects = children.ToArray(); if(targetObjects.Length > 0) { for(int i = 0; i < Mathf.Min(targetObjects.Length, 128); i++) { if(targetObjects[i] != null) { mPoints[i * 3] = targetObjects[i].position.x; mPoints[i * 3 + 1] = targetObjects[i].position.z; } } mMaterial.SetFloatArray("_Hits", mPoints); mMaterial.SetInt("_HitCount", Mathf.Min(targetObjects.Length, 128)); } } /// /// 手动添加热力点 /// /// X坐标 /// Z坐标(参数名保持原样) public void addHitPoint(float xp, float yp) { int index = mHitCount % 128; // 循环使用热力点数组 // 存储新热力点数据 mPoints[index * 3] = xp; // X坐标(直接使用世界空间坐标) mPoints[index * 3 + 1] = yp; // Z坐标 mPoints[index * 3 + 2] = Random.Range(热力图强度范围最小值, 热力图强度范围最大值); // 随机强度值 mHitCount++; // 更新shader参数 mMaterial.SetFloatArray("_Hits", mPoints); mMaterial.SetInt("_HitCount", Mathf.Min(mHitCount, 128)); } }