Files
2024-11-20 15:21:28 +01:00

67 lines
1.9 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Lux_SRP_GrassDisplacement {
[ExecuteInEditMode]
public class ControlDisplacer : MonoBehaviour {
public float maxDistance = 1.0f;
public float fallOff = 2.0f;
[Layer]
public int layerMask = 0;
[Space(5)]
public bool DebugRay = true;
private Transform trans;
private Renderer rend;
private MaterialPropertyBlock mpb;
private RaycastHit hit;
private float alpha;
void OnEnable() {
trans = this.GetComponent<Transform>();
rend = this.GetComponent<Renderer>();
mpb = new MaterialPropertyBlock();
mpb.Clear();
rend.SetPropertyBlock(mpb);
}
void OnDisable() {
mpb.Clear();
rend.SetPropertyBlock(null);
}
void Update() {
var mask = 1 << layerMask;
if (Physics.Raycast(trans.position, Vector3.down, out hit, maxDistance, mask )) {
#if UNITY_EDITOR
if(DebugRay) {
Debug.DrawRay(transform.position, Vector3.down * hit.distance, Color.green);
}
#endif
alpha = (float)(1.0 - Math.Pow(hit.distance / maxDistance, fallOff));
mpb.SetFloat("_Alpha", alpha);
rend.SetPropertyBlock(mpb);
}
else {
#if UNITY_EDITOR
if(DebugRay) {
Debug.DrawRay(transform.position, Vector3.down * maxDistance, Color.red);
}
#endif
if (alpha != 0.0f) {
alpha = 0.0f;
mpb.SetFloat("_Alpha", 0.0f);
rend.SetPropertyBlock(mpb);
}
}
}
}
}