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