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