Tweak the tree hiding shader
This commit is contained in:
@@ -0,0 +1,17 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!114 &11400000
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 84c706bc73fc93344972b30d598a0b81, type: 3}
|
||||
m_Name: DefaultDitherFade
|
||||
m_EditorClassIdentifier:
|
||||
verticalOffset: 0.75
|
||||
cameraDistanceRange: {x: 1, y: 35}
|
||||
hideRadiusRange: {x: 0.6, y: 0.2}
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: cddf83aa7585c1a4a8a34e8383f52f44
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+30
-16
@@ -5,10 +5,14 @@ using UnityEngine;
|
||||
namespace Toria.Game
|
||||
{
|
||||
[RequireComponent(typeof(CapsuleCollider))]
|
||||
public class LeavesHidingDither : MonoBehaviour
|
||||
public class DitherFade : MonoBehaviour
|
||||
{
|
||||
public DitherFadeSettings settings;
|
||||
public List<Renderer> targetRenderers;
|
||||
public bool makeShadowClones = true;
|
||||
|
||||
[NonSerialized]
|
||||
List<Material> treeMaterials;
|
||||
List<Material> fadeMaterials;
|
||||
|
||||
static RPGController player = null;
|
||||
static new Camera camera = null;
|
||||
@@ -18,38 +22,44 @@ namespace Toria.Game
|
||||
|
||||
void Start()
|
||||
{
|
||||
treeMaterials = new List<Material>();
|
||||
fadeMaterials = new List<Material>();
|
||||
|
||||
foreach (Renderer renderer in GetComponentsInChildren<Renderer>())
|
||||
foreach (Renderer renderer in targetRenderers)
|
||||
{
|
||||
MakeShadowClone(renderer);
|
||||
if (makeShadowClones)
|
||||
MakeShadowClone(renderer);
|
||||
|
||||
Material mat = Instantiate(renderer.sharedMaterial);
|
||||
renderer.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;
|
||||
renderer.sharedMaterial = mat;
|
||||
treeMaterials.Add(mat);
|
||||
fadeMaterials.Add(mat);
|
||||
}
|
||||
}
|
||||
|
||||
void MakeShadowClone(Renderer renderer)
|
||||
{
|
||||
GameObject shadowClone = Instantiate(renderer.gameObject);
|
||||
if (!renderer.TryGetComponent(out MeshFilter filter))
|
||||
return;
|
||||
|
||||
for (int i = shadowClone.transform.childCount - 1; i >= 0; i--)
|
||||
Destroy(shadowClone.transform.GetChild(i).gameObject);
|
||||
GameObject shadowClone = new GameObject("Shadow clone");
|
||||
|
||||
shadowClone.name = "Shadow clone";
|
||||
shadowClone.transform.SetParent(renderer.transform);
|
||||
shadowClone.transform.SetLocalPositionAndRotation(Vector3.zero, Quaternion.identity);
|
||||
shadowClone.transform.localScale = Vector3.one;
|
||||
|
||||
MeshRenderer shadowRenderer = shadowClone.AddComponent<MeshRenderer>();
|
||||
MeshFilter shadowFilter = shadowClone.AddComponent<MeshFilter>();
|
||||
|
||||
shadowRenderer.sharedMaterial = renderer.sharedMaterial;
|
||||
shadowRenderer.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.ShadowsOnly;
|
||||
|
||||
shadowFilter.sharedMesh = filter.sharedMesh;
|
||||
|
||||
foreach (Component comp in shadowClone.GetComponents<Component>())
|
||||
{
|
||||
if (comp is not MeshRenderer && comp is not MeshFilter && comp is not Transform)
|
||||
Destroy(comp);
|
||||
}
|
||||
|
||||
shadowClone.GetComponent<Renderer>().shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.ShadowsOnly;
|
||||
renderer.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;
|
||||
}
|
||||
|
||||
void Update()
|
||||
@@ -59,10 +69,14 @@ namespace Toria.Game
|
||||
|
||||
if (shouldHide)
|
||||
{
|
||||
Vector2 viewPortPoint = camera.WorldToViewportPoint(player.transform.position);
|
||||
Vector2 viewPortPoint = camera.WorldToViewportPoint(player.transform.position + Vector3.up * settings.verticalOffset);
|
||||
float hideRadius = settings.GetHideRadius(player.transform, camera.transform);
|
||||
|
||||
foreach (Material mat in treeMaterials)
|
||||
foreach (Material mat in fadeMaterials)
|
||||
{
|
||||
mat.SetVector("_PlayerPosition", viewPortPoint);
|
||||
mat.SetFloat("_HideRadius", hideRadius);
|
||||
}
|
||||
}
|
||||
|
||||
if (!camera)
|
||||
@@ -98,7 +112,7 @@ namespace Toria.Game
|
||||
|
||||
shouldHide = enabled;
|
||||
|
||||
foreach (Material mat in treeMaterials)
|
||||
foreach (Material mat in fadeMaterials)
|
||||
mat.SetFloat("_ShouldHide", enabled ? 1 : 0);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2dcaa5393f14a8846841c6152807c45c
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences:
|
||||
- settings: {fileID: 11400000, guid: cddf83aa7585c1a4a8a34e8383f52f44, type: 2}
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,18 @@
|
||||
using UnityEngine;
|
||||
|
||||
namespace Toria.Game
|
||||
{
|
||||
[CreateAssetMenu(menuName = "Toria/VFX/DitherFadeSettings")]
|
||||
public class DitherFadeSettings : ScriptableObject
|
||||
{
|
||||
public float verticalOffset;
|
||||
public Vector2 cameraDistanceRange;
|
||||
public Vector2 hideRadiusRange;
|
||||
|
||||
public float GetHideRadius(Transform player, Transform camera)
|
||||
{
|
||||
float normalizedDist = Mathf.InverseLerp(cameraDistanceRange.x, cameraDistanceRange.y, Vector3.Distance(player.position, camera.position));
|
||||
return Mathf.Lerp(hideRadiusRange.x, hideRadiusRange.y, normalizedDist);
|
||||
}
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2dcaa5393f14a8846841c6152807c45c
|
||||
guid: 84c706bc73fc93344972b30d598a0b81
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
Reference in New Issue
Block a user