summaryrefslogtreecommitdiff
path: root/ch.sycoforge.Decal.Demo
diff options
context:
space:
mode:
authorchai <215380520@qq.com>2024-03-13 11:00:58 +0800
committerchai <215380520@qq.com>2024-03-13 11:00:58 +0800
commit6ce8b9e22fc13be34b442c7b6af48b42cd44275a (patch)
treeb38119d2acf0a982cb67e381f146924b9bfc3b3f /ch.sycoforge.Decal.Demo
+init
Diffstat (limited to 'ch.sycoforge.Decal.Demo')
-rw-r--r--ch.sycoforge.Decal.Demo/AdvancedBulletHoles.cs55
-rw-r--r--ch.sycoforge.Decal.Demo/BasicBulletHoles.cs37
-rw-r--r--ch.sycoforge.Decal.Demo/BezierUtil.cs77
-rw-r--r--ch.sycoforge.Decal.Demo/LineUtil.cs50
-rw-r--r--ch.sycoforge.Decal.Demo/PathAgent.cs106
-rw-r--r--ch.sycoforge.Decal.Demo/ProxyRegister.cs13
-rw-r--r--ch.sycoforge.Decal.Demo/Sinoid.cs29
7 files changed, 367 insertions, 0 deletions
diff --git a/ch.sycoforge.Decal.Demo/AdvancedBulletHoles.cs b/ch.sycoforge.Decal.Demo/AdvancedBulletHoles.cs
new file mode 100644
index 0000000..28e5311
--- /dev/null
+++ b/ch.sycoforge.Decal.Demo/AdvancedBulletHoles.cs
@@ -0,0 +1,55 @@
+using UnityEngine;
+
+namespace ch.sycoforge.Decal.Demo;
+
+public class AdvancedBulletHoles : MonoBehaviour
+{
+ public EasyDecal DecalPrefab;
+
+ public GameObject ImpactParticles;
+
+ public float CastRadius = 0.25f;
+
+ private void Start()
+ {
+ if (DecalPrefab == null)
+ {
+ Debug.LogError("The AdvancedBulletHoles script has no decal prefab attached.");
+ }
+ EasyDecal.HideMesh = false;
+ }
+
+ private void Update()
+ {
+ if (!Input.GetMouseButtonUp(0))
+ {
+ return;
+ }
+ Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
+ if (!Physics.Raycast(ray, out var hitInfo, 200f))
+ {
+ return;
+ }
+ GameObject receiver = hitInfo.collider.gameObject;
+ Vector3 point = hitInfo.point;
+ RaycastHit[] array = Physics.SphereCastAll(ray, CastRadius, Vector3.Distance(Camera.main.transform.position, point) + 2f);
+ Vector3 normal = hitInfo.normal;
+ if (array.Length > 0)
+ {
+ RaycastHit[] array2 = array;
+ for (int i = 0; i < array2.Length; i++)
+ {
+ RaycastHit raycastHit = array2[i];
+ Debug.DrawLine(ray.origin, raycastHit.point, Color.red);
+ normal += raycastHit.normal;
+ }
+ }
+ normal /= (float)(array.Length + 1);
+ EasyDecal.ProjectAt(DecalPrefab.gameObject, receiver, point, normal);
+ if (ImpactParticles != null)
+ {
+ Quaternion rotation = Quaternion.FromToRotation(Vector3.up, normal);
+ Object.Instantiate(ImpactParticles, point, rotation);
+ }
+ }
+}
diff --git a/ch.sycoforge.Decal.Demo/BasicBulletHoles.cs b/ch.sycoforge.Decal.Demo/BasicBulletHoles.cs
new file mode 100644
index 0000000..0d6eef1
--- /dev/null
+++ b/ch.sycoforge.Decal.Demo/BasicBulletHoles.cs
@@ -0,0 +1,37 @@
+using UnityEngine;
+
+namespace ch.sycoforge.Decal.Demo;
+
+public class BasicBulletHoles : MonoBehaviour
+{
+ public EasyDecal DecalPrefab;
+
+ private bool t;
+
+ public void Start()
+ {
+ if (DecalPrefab == null)
+ {
+ Debug.LogError("The DynamicDemo script has no decal prefab attached.");
+ }
+ }
+
+ public void Update()
+ {
+ if (!Input.GetMouseButtonUp(0))
+ {
+ return;
+ }
+ Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
+ if (Physics.Raycast(ray, out var hitInfo, 200f))
+ {
+ Debug.DrawLine(ray.origin, hitInfo.point, Color.red);
+ EasyDecal easyDecal = EasyDecal.ProjectAt(DecalPrefab.gameObject, hitInfo.collider.gameObject, hitInfo.point, hitInfo.normal);
+ t = !t;
+ if (t)
+ {
+ easyDecal.CancelFade();
+ }
+ }
+ }
+}
diff --git a/ch.sycoforge.Decal.Demo/BezierUtil.cs b/ch.sycoforge.Decal.Demo/BezierUtil.cs
new file mode 100644
index 0000000..4784ce7
--- /dev/null
+++ b/ch.sycoforge.Decal.Demo/BezierUtil.cs
@@ -0,0 +1,77 @@
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace ch.sycoforge.Decal.Demo;
+
+public static class BezierUtil
+{
+ public static List<Vector3> InterpolatePath(List<Vector3> path, int segments, float radius, float angleThreshold)
+ {
+ if (path.Count >= 3)
+ {
+ List<Vector3> list = new List<Vector3>();
+ int num = path.Count - 1;
+ list.Add(path[0]);
+ int num2 = 0;
+ for (int i = 2; i < path.Count; i++)
+ {
+ Vector3 vector = path[i - 2];
+ Vector3 vector2 = path[i - 1];
+ Vector3 vector3 = path[i];
+ Vector3 vector4 = vector2 - vector;
+ Vector3 vector5 = vector3 - vector2;
+ float num3 = Mathf.Abs(Vector3.Angle(vector4, vector5));
+ if (!(num3 <= angleThreshold))
+ {
+ float magnitude = vector4.magnitude;
+ float magnitude2 = vector5.magnitude;
+ vector4.Normalize();
+ vector5.Normalize();
+ magnitude = Mathf.Min(magnitude * 0.5f, radius);
+ magnitude2 = Mathf.Min(magnitude2 * 0.5f, radius);
+ Vector3 vector6 = vector2 - vector4 * magnitude;
+ Vector3 vector7 = vector2;
+ Vector3 vector8 = vector2 + vector5 * magnitude2;
+ for (int j = 0; j < segments; j++)
+ {
+ float num4 = (float)j / ((float)segments - 1f);
+ float num5 = 1f - num4;
+ Vector3 item = num5 * num5 * vector6 + 2f * num5 * num4 * vector7 + num4 * num4 * vector8;
+ list.Add(item);
+ }
+ num2 = i;
+ }
+ }
+ if (num2 <= num)
+ {
+ list.Add(path[num]);
+ }
+ return list;
+ }
+ return path;
+ }
+
+ public static Vector3[] GetBezierApproximation(Vector3[] controlPoints, int outputSegmentCount)
+ {
+ Vector3[] array = new Vector3[outputSegmentCount + 1];
+ for (int i = 0; i < outputSegmentCount; i++)
+ {
+ float t = (float)i / (float)outputSegmentCount;
+ ref Vector3 reference = ref array[i];
+ reference = GetBezierPoint(t, controlPoints, 0, controlPoints.Length);
+ }
+ return array;
+ }
+
+ public static Vector3 GetBezierPoint(float t, Vector3[] controlPoints, int index, int count)
+ {
+ if (count == 1)
+ {
+ return controlPoints[index];
+ }
+ Vector3 bezierPoint = GetBezierPoint(t, controlPoints, index - 1, count - 1);
+ Vector3 bezierPoint2 = GetBezierPoint(t, controlPoints, index, count - 1);
+ Vector3 bezierPoint3 = GetBezierPoint(t, controlPoints, index + 1, count - 1);
+ return (1f - t) * (1f - t) * bezierPoint + 2f * (1f - t) * t * bezierPoint2 + t * t * bezierPoint3;
+ }
+}
diff --git a/ch.sycoforge.Decal.Demo/LineUtil.cs b/ch.sycoforge.Decal.Demo/LineUtil.cs
new file mode 100644
index 0000000..864ee19
--- /dev/null
+++ b/ch.sycoforge.Decal.Demo/LineUtil.cs
@@ -0,0 +1,50 @@
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace ch.sycoforge.Decal.Demo;
+
+public static class LineUtil
+{
+ public static void DrawPath(float thickness, Material material, List<Vector3> path)
+ {
+ if (path != null && (path == null || path.Count >= 2))
+ {
+ if (thickness <= Mathf.Epsilon)
+ {
+ GL.Begin(1);
+ }
+ else
+ {
+ GL.Begin(7);
+ }
+ material.SetPass(0);
+ GL.Color(Color.blue);
+ Vector3 start = path[0];
+ for (int i = 1; i < path.Count; i++)
+ {
+ Vector3 vector = path[i];
+ DrawLine(thickness, start, vector);
+ start = vector;
+ }
+ GL.End();
+ }
+ }
+
+ private static void DrawLine(float thickness, Vector3 start, Vector3 end)
+ {
+ if (thickness <= Mathf.Epsilon)
+ {
+ GL.Vertex(start);
+ GL.Vertex(end);
+ return;
+ }
+ Camera main = Camera.main;
+ Vector3 normalized = (end - start).normalized;
+ Vector3 normalized2 = (start - main.transform.position).normalized;
+ Vector3 vector = Vector3.Cross(normalized2, normalized) * (thickness / 2f);
+ GL.Vertex(start - vector);
+ GL.Vertex(start + vector);
+ GL.Vertex(end + vector);
+ GL.Vertex(end - vector);
+ }
+}
diff --git a/ch.sycoforge.Decal.Demo/PathAgent.cs b/ch.sycoforge.Decal.Demo/PathAgent.cs
new file mode 100644
index 0000000..27908d7
--- /dev/null
+++ b/ch.sycoforge.Decal.Demo/PathAgent.cs
@@ -0,0 +1,106 @@
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.AI;
+
+namespace ch.sycoforge.Decal.Demo;
+
+[RequireComponent(typeof(NavMeshAgent))]
+[RequireComponent(typeof(LineRenderer))]
+public class PathAgent : MonoBehaviour
+{
+ public float PathThickness = 1f;
+
+ [Tooltip("Distance from the ground.")]
+ public float NormalPathOffset;
+
+ [Tooltip("Max radius between segments.")]
+ [Range(0.001f, 0.5f)]
+ public float Radius = 0.25f;
+
+ [Tooltip("Discard segments when their angle is smaller than this value.")]
+ public float AngleThreshold = 5f;
+
+ public bool DrawGizmos;
+
+ public EasyDecal TargetAimDecal;
+
+ public GameObject TargetPointDecalPrefab;
+
+ private List<Vector3> path = new List<Vector3>();
+
+ private NavMeshAgent agent;
+
+ private LineRenderer lineRenderer;
+
+ private Vector3 decalOffset = Vector3.up * 0.5f;
+
+ private const int MAXDISTANCE = 50;
+
+ private void Start()
+ {
+ TargetAimDecal.gameObject.SetActive(value: false);
+ agent = GetComponent<NavMeshAgent>();
+ lineRenderer = GetComponent<LineRenderer>();
+ }
+
+ private void Update()
+ {
+ Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
+ CreatePath(ray);
+ SetTarget(ray);
+ }
+
+ private void SetTarget(Ray mouseRay)
+ {
+ if (Input.GetMouseButtonUp(0) && Physics.Raycast(mouseRay, out var hitInfo, 50f))
+ {
+ agent.SetDestination(hitInfo.point);
+ EasyDecal.ProjectAt(TargetPointDecalPrefab, hitInfo.collider.gameObject, hitInfo.point + decalOffset, Quaternion.identity);
+ }
+ }
+
+ private void CreatePath(Ray mouseRay)
+ {
+ if (Physics.Raycast(mouseRay, out var hitInfo, 50f))
+ {
+ Vector3 position = base.transform.position;
+ Vector3 point = hitInfo.point;
+ path.Clear();
+ NavMeshPath navMeshPath = new NavMeshPath();
+ if (NavMesh.CalculatePath(position, point, -1, navMeshPath) && navMeshPath.status == NavMeshPathStatus.PathComplete)
+ {
+ int num = navMeshPath.corners.Length;
+ Vector3 vector = base.transform.up;
+ for (int i = 0; i < num; i++)
+ {
+ if (i > 0 && NormalPathOffset > 0f && Physics.Raycast(navMeshPath.corners[i], Vector3.down, out var _, NormalPathOffset * 10f))
+ {
+ vector = hitInfo.normal;
+ }
+ Vector3 item = navMeshPath.corners[i] + vector * NormalPathOffset;
+ path.Add(item);
+ }
+ Vector3[] array = BezierUtil.InterpolatePath(path, 10, Radius, AngleThreshold).ToArray();
+ lineRenderer.SetVertexCount(array.Length);
+ lineRenderer.SetPositions(array);
+ TargetAimDecal.gameObject.SetActive(value: true);
+ TargetAimDecal.gameObject.transform.position = navMeshPath.corners[num - 1] + decalOffset;
+ return;
+ }
+ }
+ TargetAimDecal.gameObject.SetActive(value: false);
+ }
+
+ private void OnDrawGizmos()
+ {
+ if (!DrawGizmos)
+ {
+ return;
+ }
+ Gizmos.color = Color.red;
+ foreach (Vector3 item in path)
+ {
+ Gizmos.DrawSphere(item, 0.05f);
+ }
+ }
+}
diff --git a/ch.sycoforge.Decal.Demo/ProxyRegister.cs b/ch.sycoforge.Decal.Demo/ProxyRegister.cs
new file mode 100644
index 0000000..1a171bf
--- /dev/null
+++ b/ch.sycoforge.Decal.Demo/ProxyRegister.cs
@@ -0,0 +1,13 @@
+using UnityEngine;
+
+namespace ch.sycoforge.Decal.Demo;
+
+public class ProxyRegister : MonoBehaviour
+{
+ public StaticProxyCollection ProxyCollection;
+
+ private void Start()
+ {
+ EasyDecal.SetStaticProxyCollection(ProxyCollection);
+ }
+}
diff --git a/ch.sycoforge.Decal.Demo/Sinoid.cs b/ch.sycoforge.Decal.Demo/Sinoid.cs
new file mode 100644
index 0000000..38ee213
--- /dev/null
+++ b/ch.sycoforge.Decal.Demo/Sinoid.cs
@@ -0,0 +1,29 @@
+using System;
+using UnityEngine;
+
+namespace ch.sycoforge.Decal.Demo;
+
+public class Sinoid : MonoBehaviour
+{
+ public float AngularVelocity = 2f;
+
+ public float SineFreq = 0.2f;
+
+ public float Amplitude = 0.25f;
+
+ private float accuTime;
+
+ private Vector3 startPos;
+
+ private void Start()
+ {
+ startPos = base.transform.position;
+ }
+
+ private void Update()
+ {
+ accuTime += Time.deltaTime;
+ base.transform.position = startPos + Vector3.up * Amplitude * Mathf.Sin(accuTime * 2f * (float)Math.PI * SineFreq);
+ base.transform.Rotate((Vector3.up + Vector3.forward) * AngularVelocity * Time.deltaTime);
+ }
+}