修改剃毛
This commit is contained in:
parent
1064bc6923
commit
4900a7a9f4
@ -8,8 +8,7 @@ Material:
|
|||||||
m_PrefabInstance: {fileID: 0}
|
m_PrefabInstance: {fileID: 0}
|
||||||
m_PrefabAsset: {fileID: 0}
|
m_PrefabAsset: {fileID: 0}
|
||||||
m_Name: Shader Graphs_TiMao
|
m_Name: Shader Graphs_TiMao
|
||||||
m_Shader: {fileID: -6465566751694194690, guid: 71f4112fdfb48b2499d0b9a9227a4f39,
|
m_Shader: {fileID: -6465566751694194690, guid: 71f4112fdfb48b2499d0b9a9227a4f39, type: 3}
|
||||||
type: 3}
|
|
||||||
m_Parent: {fileID: 0}
|
m_Parent: {fileID: 0}
|
||||||
m_ModifiedSerializedProperties: 0
|
m_ModifiedSerializedProperties: 0
|
||||||
m_ValidKeywords: []
|
m_ValidKeywords: []
|
||||||
@ -24,6 +23,10 @@ Material:
|
|||||||
m_SavedProperties:
|
m_SavedProperties:
|
||||||
serializedVersion: 3
|
serializedVersion: 3
|
||||||
m_TexEnvs:
|
m_TexEnvs:
|
||||||
|
- _AO:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
- _Cubemap:
|
- _Cubemap:
|
||||||
m_Texture: {fileID: 8900000, guid: 4d02be114fa362d4c8f2930512feed6f, type: 3}
|
m_Texture: {fileID: 8900000, guid: 4d02be114fa362d4c8f2930512feed6f, type: 3}
|
||||||
m_Scale: {x: 1, y: 1}
|
m_Scale: {x: 1, y: 1}
|
||||||
@ -36,6 +39,10 @@ Material:
|
|||||||
m_Texture: {fileID: 2800000, guid: 10f36425885b13c41b4f5732d27cb050, type: 3}
|
m_Texture: {fileID: 2800000, guid: 10f36425885b13c41b4f5732d27cb050, type: 3}
|
||||||
m_Scale: {x: 1, y: 1}
|
m_Scale: {x: 1, y: 1}
|
||||||
m_Offset: {x: 0, y: 0}
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _Normal:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
- _ValueMask:
|
- _ValueMask:
|
||||||
m_Texture: {fileID: 2800000, guid: 625e84e011f035b4dbdd7a85a7a8f2b3, type: 3}
|
m_Texture: {fileID: 2800000, guid: 625e84e011f035b4dbdd7a85a7a8f2b3, type: 3}
|
||||||
m_Scale: {x: 1, y: 1}
|
m_Scale: {x: 1, y: 1}
|
||||||
@ -54,10 +61,11 @@ Material:
|
|||||||
m_Offset: {x: 0, y: 0}
|
m_Offset: {x: 0, y: 0}
|
||||||
m_Ints: []
|
m_Ints: []
|
||||||
m_Floats:
|
m_Floats:
|
||||||
|
- _AoValue: 1
|
||||||
- _GValue: 1
|
- _GValue: 1
|
||||||
- _QueueControl: 0
|
- _QueueControl: 0
|
||||||
- _QueueOffset: 0
|
- _QueueOffset: 0
|
||||||
- _TValue: 0.08
|
- _TValue: 1
|
||||||
m_Colors:
|
m_Colors:
|
||||||
- _Color: {r: 1, g: 1, b: 1, a: 0}
|
- _Color: {r: 1, g: 1, b: 1, a: 0}
|
||||||
m_BuildTextureStacks: []
|
m_BuildTextureStacks: []
|
||||||
|
|||||||
@ -1,129 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using UnityEngine;
|
|
||||||
using UnityEngine.Rendering;
|
|
||||||
using UnityEngine.Rendering.Universal;
|
|
||||||
|
|
||||||
public class RongMaoBody : MonoBehaviour
|
|
||||||
{
|
|
||||||
//public Shader shader;
|
|
||||||
[Header("渲染目标")]
|
|
||||||
public Renderer Target;
|
|
||||||
public Shader BaseShader;
|
|
||||||
|
|
||||||
[Header("皮毛物理")]
|
|
||||||
public int LayerCount = 10;
|
|
||||||
public float FurLength = 0.5f;
|
|
||||||
public Vector3 FurFore;
|
|
||||||
public Texture2D Noise;
|
|
||||||
public Texture2D Noise2;
|
|
||||||
public Texture2D MainTex;
|
|
||||||
public Texture2D Mask;
|
|
||||||
//public Texture2D ValueMask;
|
|
||||||
//[Range(0.08f,1)]public float TValue=1;
|
|
||||||
//[Range(0.08f,1)]public float GValue=1;
|
|
||||||
|
|
||||||
[Header("皮毛渲染")]
|
|
||||||
//毛发染色
|
|
||||||
public Color FurColor=Color.white;
|
|
||||||
public Color ShadowColor=Color.white;
|
|
||||||
public float ShadowPow = 2;
|
|
||||||
public float SpPow=1.0f;
|
|
||||||
public float SpScale=1.0f;
|
|
||||||
public float FPow=1.0f;
|
|
||||||
public float FScale=1.0f;
|
|
||||||
public float FurTenacity=1.0f;
|
|
||||||
private GameObject[] layers;
|
|
||||||
|
|
||||||
private Material mat;
|
|
||||||
// Start is called before the first frame update
|
|
||||||
void Start()
|
|
||||||
{
|
|
||||||
CreateFur();
|
|
||||||
//mat=Target.gameObject.GetComponent<Renderer>().material;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update is called once per frame
|
|
||||||
void Update()
|
|
||||||
{
|
|
||||||
UpadteTransform();
|
|
||||||
}
|
|
||||||
//更新每层毛发的位置
|
|
||||||
void UpadteTransform()
|
|
||||||
{
|
|
||||||
if (layers == null || layers.Length == 0)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
for (int i = 0; i < layers.Length; i++)
|
|
||||||
{
|
|
||||||
//依据层数、毛发长度和毛发硬度计算lerp速度
|
|
||||||
float lerpSpeed = (layers.Length-i) * (1.0f / layers.Length)* FurTenacity;
|
|
||||||
|
|
||||||
//让Shell的位置和旋转Lerp到目标模型
|
|
||||||
//后面乘的常数完全是试出来的参数……没有具体物理解释,移动时毛发更新
|
|
||||||
layers[i].gameObject.transform.position = Vector3.Lerp(layers[i].gameObject.transform.position, Target.transform.position, lerpSpeed * Time.deltaTime *20);
|
|
||||||
layers[i].gameObject.transform.rotation = Quaternion.Lerp(layers[i].gameObject.transform.rotation, Target.transform.rotation, lerpSpeed * Time.deltaTime *10);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//创建毛发
|
|
||||||
void CreateFur()
|
|
||||||
{
|
|
||||||
layers = new GameObject[LayerCount];
|
|
||||||
float furOffset = 1.0f / LayerCount;
|
|
||||||
for (int i = 0; i < LayerCount; i++)
|
|
||||||
{
|
|
||||||
GameObject layer = Instantiate(Target.gameObject, Target.transform.position, Target.transform.rotation,this.transform);
|
|
||||||
|
|
||||||
layer.hideFlags = HideFlags.HideInHierarchy;
|
|
||||||
//layer.tag = "Shell";
|
|
||||||
Material[] mats = layer.GetComponent<Renderer>().materials;
|
|
||||||
mats[0]=new Material(BaseShader);
|
|
||||||
layer.GetComponent<Renderer>().materials =mats;// Basemat;
|
|
||||||
Material layerMat = layer.GetComponent<Renderer>().materials[0];
|
|
||||||
//for (int j = 0; j < layerMats.Length; j++)
|
|
||||||
// {
|
|
||||||
//Material layerMat = layerMats[i];
|
|
||||||
layerMat.SetTexture("_MainTex",MainTex);
|
|
||||||
layerMat.SetColor("_Color",FurColor);
|
|
||||||
layerMat.SetFloat("_SpPow",SpPow);
|
|
||||||
layerMat.SetFloat("_SpScale",SpScale);
|
|
||||||
layerMat.SetFloat("_FPow",FPow);
|
|
||||||
layerMat.SetFloat("_FScale",FScale);
|
|
||||||
|
|
||||||
layerMat.SetFloat("_FurLength",FurLength);
|
|
||||||
layerMat.SetTexture("_Noise",Noise);
|
|
||||||
layerMat.SetTexture("_Noise2",Noise2);
|
|
||||||
layerMat.SetTexture("_Mask",Mask);
|
|
||||||
//layerMat.SetTexture("_ValueMask",ValueMask);
|
|
||||||
layerMat.SetColor("_ShadowColor",ShadowColor);
|
|
||||||
layerMat.SetFloat("_ShadowPow",ShadowPow);
|
|
||||||
layerMat.SetFloat("_LayerOffset",i*furOffset);
|
|
||||||
layerMat.SetVector("_FurOffset",FurFore*Mathf.Pow(i*furOffset,FurTenacity)*0.0f);
|
|
||||||
|
|
||||||
layerMat.renderQueue = 3000 + i;
|
|
||||||
//}
|
|
||||||
|
|
||||||
|
|
||||||
layers[i] = layer;
|
|
||||||
}
|
|
||||||
//Debug.Log("创建完毕");
|
|
||||||
}
|
|
||||||
|
|
||||||
private Camera cam;
|
|
||||||
|
|
||||||
//删除创建的游戏毛发
|
|
||||||
private void OnDestroy()
|
|
||||||
{
|
|
||||||
// if (layers == null || layers.length == 0)
|
|
||||||
// {
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// for (int i = 0; i < layers.length; i++)
|
|
||||||
// {
|
|
||||||
// destroy(layers[i].gameobject);
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,11 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: f12d4af7ab2b81c4ea3b01b6f5eac087
|
|
||||||
MonoImporter:
|
|
||||||
externalObjects: {}
|
|
||||||
serializedVersion: 2
|
|
||||||
defaultReferences: []
|
|
||||||
executionOrder: 0
|
|
||||||
icon: {instanceID: 0}
|
|
||||||
userData:
|
|
||||||
assetBundleName:
|
|
||||||
assetBundleVariant:
|
|
||||||
@ -1,137 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using UnityEngine;
|
|
||||||
using UnityEngine.Rendering;
|
|
||||||
|
|
||||||
public class RongMaoDu : MonoBehaviour
|
|
||||||
{
|
|
||||||
//public Shader shader;
|
|
||||||
[Header("渲染目标")]
|
|
||||||
public Renderer Target;
|
|
||||||
public Shader BaseShader;
|
|
||||||
|
|
||||||
[Header("皮毛物理")]
|
|
||||||
public int LayerCount = 10;
|
|
||||||
public float FurLength = 0.5f;
|
|
||||||
public Vector3 FurFore;
|
|
||||||
public Texture2D Noise;
|
|
||||||
public Texture2D Noise2;
|
|
||||||
public Texture2D MainTex;
|
|
||||||
public Texture2D Mask;
|
|
||||||
public Texture2D ValueMask;
|
|
||||||
[Range(0.08f,1)]public float TValue=1;
|
|
||||||
//[Range(0.08f,1)]public float GValue=1;
|
|
||||||
|
|
||||||
[Header("皮毛渲染")]
|
|
||||||
//毛发染色
|
|
||||||
public Color FurColor=Color.white;
|
|
||||||
public Color ShadowColor=Color.white;
|
|
||||||
public float ShadowPow = 2;
|
|
||||||
public float SpPow=1.0f;
|
|
||||||
public float SpScale=1.0f;
|
|
||||||
public float FPow=1.0f;
|
|
||||||
public float FScale=1.0f;
|
|
||||||
public float FurTenacity=1.0f;
|
|
||||||
private GameObject[] layers;
|
|
||||||
|
|
||||||
private Material mat;
|
|
||||||
// Start is called before the first frame update
|
|
||||||
void Start()
|
|
||||||
{
|
|
||||||
CreateFur();
|
|
||||||
mat=Target.gameObject.GetComponent<Renderer>().materials[1];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update is called once per frame
|
|
||||||
void Update()
|
|
||||||
{
|
|
||||||
UpadteTransform();
|
|
||||||
UpdateValue();
|
|
||||||
}
|
|
||||||
//更新每层毛发的位置
|
|
||||||
void UpadteTransform()
|
|
||||||
{
|
|
||||||
if (layers == null || layers.Length == 0)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
for (int i = 0; i < layers.Length; i++)
|
|
||||||
{
|
|
||||||
//依据层数、毛发长度和毛发硬度计算lerp速度
|
|
||||||
float lerpSpeed = (layers.Length-i) * (1.0f / layers.Length)* FurTenacity;
|
|
||||||
|
|
||||||
//让Shell的位置和旋转Lerp到目标模型
|
|
||||||
//后面乘的常数完全是试出来的参数……没有具体物理解释,移动时毛发更新
|
|
||||||
layers[i].gameObject.transform.position = Vector3.Lerp(layers[i].gameObject.transform.position, Target.transform.position, lerpSpeed * Time.deltaTime *20);
|
|
||||||
layers[i].gameObject.transform.rotation = Quaternion.Lerp(layers[i].gameObject.transform.rotation, Target.transform.rotation, lerpSpeed * Time.deltaTime *10);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//创建毛发
|
|
||||||
void CreateFur()
|
|
||||||
{
|
|
||||||
layers = new GameObject[LayerCount];
|
|
||||||
float furOffset = 1.0f / LayerCount;
|
|
||||||
for (int i = 0; i < LayerCount; i++)
|
|
||||||
{
|
|
||||||
GameObject layer = Instantiate(Target.gameObject, Target.transform.position, Target.transform.rotation,this.transform);
|
|
||||||
|
|
||||||
layer.hideFlags = HideFlags.HideInHierarchy;
|
|
||||||
//layer.tag = "Shell";
|
|
||||||
Material[] mats = layer.GetComponent<Renderer>().materials;
|
|
||||||
mats[1]=new Material(BaseShader);
|
|
||||||
layer.GetComponent<Renderer>().materials =mats;// Basemat;
|
|
||||||
Material layerMat = layer.GetComponent<Renderer>().materials[1];
|
|
||||||
//for (int j = 0; j < layerMats.Length; j++)
|
|
||||||
// {
|
|
||||||
//Material layerMat = layerMats[i];
|
|
||||||
layerMat.SetTexture("_MainTex",MainTex);
|
|
||||||
layerMat.SetColor("_Color",FurColor);
|
|
||||||
layerMat.SetFloat("_SpPow",SpPow);
|
|
||||||
layerMat.SetFloat("_SpScale",SpScale);
|
|
||||||
layerMat.SetFloat("_FPow",FPow);
|
|
||||||
layerMat.SetFloat("_FScale",FScale);
|
|
||||||
|
|
||||||
layerMat.SetFloat("_FurLength",FurLength);
|
|
||||||
layerMat.SetTexture("_Noise",Noise);
|
|
||||||
layerMat.SetTexture("_Noise2",Noise2);
|
|
||||||
layerMat.SetTexture("_Mask",Mask);
|
|
||||||
layerMat.SetTexture("_ValueMask",ValueMask);
|
|
||||||
layerMat.SetColor("_ShadowColor",ShadowColor);
|
|
||||||
layerMat.SetFloat("_ShadowPow",ShadowPow);
|
|
||||||
layerMat.SetFloat("_LayerOffset",i*furOffset);
|
|
||||||
layerMat.SetVector("_FurOffset",FurFore*Mathf.Pow(i*furOffset,FurTenacity)*0.0f);
|
|
||||||
|
|
||||||
layerMat.renderQueue = 3000 + i;
|
|
||||||
//}
|
|
||||||
|
|
||||||
|
|
||||||
layers[i] = layer;
|
|
||||||
}
|
|
||||||
//Debug.Log("创建完毕");
|
|
||||||
}
|
|
||||||
|
|
||||||
void UpdateValue()
|
|
||||||
{
|
|
||||||
for (int i = 0; i < layers.Length; i++)
|
|
||||||
{
|
|
||||||
Material layerMat = layers[i].GetComponent<Renderer>().materials[1];
|
|
||||||
layerMat.SetFloat("_Value",TValue);
|
|
||||||
mat.SetFloat("_TValue",TValue);
|
|
||||||
//mat.SetFloat("_GValue",GValue);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//删除创建的游戏毛发
|
|
||||||
private void OnDestroy()
|
|
||||||
{
|
|
||||||
// if (layers == null || layers.length == 0)
|
|
||||||
// {
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// for (int i = 0; i < layers.length; i++)
|
|
||||||
// {
|
|
||||||
// destroy(layers[i].gameobject);
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,11 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: 598e923d669eaab46b0f7d156768c0d6
|
|
||||||
MonoImporter:
|
|
||||||
externalObjects: {}
|
|
||||||
serializedVersion: 2
|
|
||||||
defaultReferences: []
|
|
||||||
executionOrder: 0
|
|
||||||
icon: {instanceID: 0}
|
|
||||||
userData:
|
|
||||||
assetBundleName:
|
|
||||||
assetBundleVariant:
|
|
||||||
@ -1,144 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using UnityEngine;
|
|
||||||
using UnityEngine.Rendering;
|
|
||||||
|
|
||||||
public class RongMaoDuWanZheng : MonoBehaviour
|
|
||||||
{
|
|
||||||
public int matNum=0;
|
|
||||||
|
|
||||||
public List<Material> Mats = new List<Material>();
|
|
||||||
//public Shader shader;
|
|
||||||
[Header("渲染目标")]
|
|
||||||
public Renderer Target;
|
|
||||||
public Shader BaseShader;
|
|
||||||
|
|
||||||
[Header("皮毛物理")]
|
|
||||||
public int LayerCount = 10;
|
|
||||||
public float FurLength = 0.5f;
|
|
||||||
public Vector3 FurFore;
|
|
||||||
public Texture2D Noise;
|
|
||||||
public Texture2D Noise2;
|
|
||||||
public Texture2D MainTex;
|
|
||||||
public Texture2D Mask;
|
|
||||||
public Texture2D ValueMask;
|
|
||||||
[Range(0.08f,1)]public float TValue=1;
|
|
||||||
//[Range(0.08f,1)]public float GValue=1;
|
|
||||||
|
|
||||||
[Header("皮毛渲染")]
|
|
||||||
//毛发染色
|
|
||||||
public Color FurColor=Color.white;
|
|
||||||
public Color ShadowColor=Color.white;
|
|
||||||
public float ShadowPow = 2;
|
|
||||||
public float SpPow=1.0f;
|
|
||||||
public float SpScale=1.0f;
|
|
||||||
public float FPow=1.0f;
|
|
||||||
public float FScale=1.0f;
|
|
||||||
public float FurTenacity=1.0f;
|
|
||||||
private GameObject[] layers;
|
|
||||||
|
|
||||||
private Material mat;
|
|
||||||
// Start is called before the first frame update
|
|
||||||
void Start()
|
|
||||||
{
|
|
||||||
CreateFur();
|
|
||||||
mat=Target.gameObject.GetComponent<Renderer>().materials[matNum];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Update is called once per frame
|
|
||||||
void Update()
|
|
||||||
{
|
|
||||||
UpadteTransform();
|
|
||||||
UpdateValue();
|
|
||||||
}
|
|
||||||
//更新每层毛发的位置
|
|
||||||
void UpadteTransform()
|
|
||||||
{
|
|
||||||
if (layers == null || layers.Length == 0)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
for (int i = 0; i < layers.Length; i++)
|
|
||||||
{
|
|
||||||
//依据层数、毛发长度和毛发硬度计算lerp速度
|
|
||||||
float lerpSpeed = (layers.Length-i) * (1.0f / layers.Length)* FurTenacity;
|
|
||||||
|
|
||||||
//让Shell的位置和旋转Lerp到目标模型
|
|
||||||
//后面乘的常数完全是试出来的参数……没有具体物理解释,移动时毛发更新
|
|
||||||
layers[i].gameObject.transform.position = Vector3.Lerp(layers[i].gameObject.transform.position, Target.transform.position, lerpSpeed * Time.deltaTime *20);
|
|
||||||
layers[i].gameObject.transform.rotation = Quaternion.Lerp(layers[i].gameObject.transform.rotation, Target.transform.rotation, lerpSpeed * Time.deltaTime *10);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//创建毛发
|
|
||||||
void CreateFur()
|
|
||||||
{
|
|
||||||
layers = new GameObject[LayerCount];
|
|
||||||
float furOffset = 1.0f / LayerCount;
|
|
||||||
for (int i = 0; i < LayerCount; i++)
|
|
||||||
{
|
|
||||||
GameObject layer = Instantiate(Target.gameObject, Target.transform.position, Target.transform.rotation,this.transform);
|
|
||||||
|
|
||||||
//layer.hideFlags = HideFlags.HideInHierarchy;
|
|
||||||
//layer.tag = "Shell";
|
|
||||||
layer.GetComponent<Renderer>().materials = Mats.ToArray();
|
|
||||||
Material[] mats = layer.GetComponent<Renderer>().materials;
|
|
||||||
|
|
||||||
mats[matNum]=new Material(BaseShader);
|
|
||||||
layer.GetComponent<Renderer>().materials =mats;
|
|
||||||
Material layerMat = layer.GetComponent<Renderer>().materials[matNum];
|
|
||||||
//for (int j = 0; j < layerMats.Length; j++)
|
|
||||||
// {
|
|
||||||
//Material layerMat = layerMats[i];
|
|
||||||
layerMat.SetTexture("_MainTex",MainTex);
|
|
||||||
layerMat.SetColor("_Color",FurColor);
|
|
||||||
layerMat.SetFloat("_SpPow",SpPow);
|
|
||||||
layerMat.SetFloat("_SpScale",SpScale);
|
|
||||||
layerMat.SetFloat("_FPow",FPow);
|
|
||||||
layerMat.SetFloat("_FScale",FScale);
|
|
||||||
|
|
||||||
layerMat.SetFloat("_FurLength",FurLength);
|
|
||||||
layerMat.SetTexture("_Noise",Noise);
|
|
||||||
layerMat.SetTexture("_Noise2",Noise2);
|
|
||||||
layerMat.SetTexture("_Mask",Mask);
|
|
||||||
layerMat.SetTexture("_ValueMask",ValueMask);
|
|
||||||
layerMat.SetColor("_ShadowColor",ShadowColor);
|
|
||||||
layerMat.SetFloat("_ShadowPow",ShadowPow);
|
|
||||||
layerMat.SetFloat("_LayerOffset",i*furOffset);
|
|
||||||
layerMat.SetVector("_FurOffset",FurFore*Mathf.Pow(i*furOffset,FurTenacity)*0.0f);
|
|
||||||
|
|
||||||
layerMat.renderQueue = 3000 + i;
|
|
||||||
//}
|
|
||||||
|
|
||||||
//layer.transform.parent = Target.transform;
|
|
||||||
layers[i] = layer;
|
|
||||||
}
|
|
||||||
//Debug.Log("创建完毕");
|
|
||||||
}
|
|
||||||
|
|
||||||
void UpdateValue()
|
|
||||||
{
|
|
||||||
for (int i = 0; i < layers.Length; i++)
|
|
||||||
{
|
|
||||||
Material layerMat = layers[i].GetComponent<Renderer>().materials[matNum];
|
|
||||||
layerMat.SetFloat("_Value",TValue);
|
|
||||||
mat.SetFloat("_TValue",TValue);
|
|
||||||
//mat.SetFloat("_GValue",GValue);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//删除创建的游戏毛发
|
|
||||||
private void OnDestroy()
|
|
||||||
{
|
|
||||||
// if (layers == null || layers.length == 0)
|
|
||||||
// {
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// for (int i = 0; i < layers.length; i++)
|
|
||||||
// {
|
|
||||||
// destroy(layers[i].gameobject);
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,11 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: 1458a57372e398240a4450d82c9194de
|
|
||||||
MonoImporter:
|
|
||||||
externalObjects: {}
|
|
||||||
serializedVersion: 2
|
|
||||||
defaultReferences: []
|
|
||||||
executionOrder: 0
|
|
||||||
icon: {instanceID: 0}
|
|
||||||
userData:
|
|
||||||
assetBundleName:
|
|
||||||
assetBundleVariant:
|
|
||||||
@ -1,140 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using UnityEngine;
|
|
||||||
using UnityEngine.Rendering;
|
|
||||||
|
|
||||||
public class RongMaoDuWanZhengOld : MonoBehaviour
|
|
||||||
{
|
|
||||||
public int matNum=0;
|
|
||||||
//public Shader shader;
|
|
||||||
[Header("渲染目标")]
|
|
||||||
public Renderer Target;
|
|
||||||
public Shader BaseShader;
|
|
||||||
|
|
||||||
[Header("皮毛物理")]
|
|
||||||
public int LayerCount = 10;
|
|
||||||
public float FurLength = 0.5f;
|
|
||||||
public Vector3 FurFore;
|
|
||||||
public Texture2D Noise;
|
|
||||||
public Texture2D Noise2;
|
|
||||||
public Texture2D MainTex;
|
|
||||||
public Texture2D Mask;
|
|
||||||
public Texture2D ValueMask;
|
|
||||||
[Range(0.08f,1)]public float TValue=1;
|
|
||||||
//[Range(0.08f,1)]public float GValue=1;
|
|
||||||
|
|
||||||
[Header("皮毛渲染")]
|
|
||||||
//毛发染色
|
|
||||||
public Color FurColor=Color.white;
|
|
||||||
public Color ShadowColor=Color.white;
|
|
||||||
public float ShadowPow = 2;
|
|
||||||
public float SpPow=1.0f;
|
|
||||||
public float SpScale=1.0f;
|
|
||||||
public float FPow=1.0f;
|
|
||||||
public float FScale=1.0f;
|
|
||||||
public float FurTenacity=1.0f;
|
|
||||||
private GameObject[] layers;
|
|
||||||
|
|
||||||
private Material mat;
|
|
||||||
// Start is called before the first frame update
|
|
||||||
void Start()
|
|
||||||
{
|
|
||||||
CreateFur();
|
|
||||||
mat=Target.gameObject.GetComponent<Renderer>().materials[matNum];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Update is called once per frame
|
|
||||||
void Update()
|
|
||||||
{
|
|
||||||
UpadteTransform();
|
|
||||||
UpdateValue();
|
|
||||||
}
|
|
||||||
//更新每层毛发的位置
|
|
||||||
void UpadteTransform()
|
|
||||||
{
|
|
||||||
if (layers == null || layers.Length == 0)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
for (int i = 0; i < layers.Length; i++)
|
|
||||||
{
|
|
||||||
//依据层数、毛发长度和毛发硬度计算lerp速度
|
|
||||||
float lerpSpeed = (layers.Length-i) * (1.0f / layers.Length)* FurTenacity;
|
|
||||||
|
|
||||||
//让Shell的位置和旋转Lerp到目标模型
|
|
||||||
//后面乘的常数完全是试出来的参数……没有具体物理解释,移动时毛发更新
|
|
||||||
layers[i].gameObject.transform.position = Vector3.Lerp(layers[i].gameObject.transform.position, Target.transform.position, lerpSpeed * Time.deltaTime *20);
|
|
||||||
layers[i].gameObject.transform.rotation = Quaternion.Lerp(layers[i].gameObject.transform.rotation, Target.transform.rotation, lerpSpeed * Time.deltaTime *10);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//创建毛发
|
|
||||||
void CreateFur()
|
|
||||||
{
|
|
||||||
layers = new GameObject[LayerCount];
|
|
||||||
float furOffset = 1.0f / LayerCount;
|
|
||||||
for (int i = 0; i < LayerCount; i++)
|
|
||||||
{
|
|
||||||
GameObject layer = Instantiate(Target.gameObject, Target.transform.position, Target.transform.rotation,this.transform);
|
|
||||||
|
|
||||||
//layer.hideFlags = HideFlags.HideInHierarchy;
|
|
||||||
//layer.tag = "Shell";
|
|
||||||
Material[] mats = layer.GetComponent<Renderer>().materials;
|
|
||||||
mats[matNum]=new Material(BaseShader);
|
|
||||||
layer.GetComponent<Renderer>().materials =mats;
|
|
||||||
Material layerMat = layer.GetComponent<Renderer>().materials[matNum];
|
|
||||||
//for (int j = 0; j < layerMats.Length; j++)
|
|
||||||
// {
|
|
||||||
//Material layerMat = layerMats[i];
|
|
||||||
layerMat.SetTexture("_MainTex",MainTex);
|
|
||||||
layerMat.SetColor("_Color",FurColor);
|
|
||||||
layerMat.SetFloat("_SpPow",SpPow);
|
|
||||||
layerMat.SetFloat("_SpScale",SpScale);
|
|
||||||
layerMat.SetFloat("_FPow",FPow);
|
|
||||||
layerMat.SetFloat("_FScale",FScale);
|
|
||||||
|
|
||||||
layerMat.SetFloat("_FurLength",FurLength);
|
|
||||||
layerMat.SetTexture("_Noise",Noise);
|
|
||||||
layerMat.SetTexture("_Noise2",Noise2);
|
|
||||||
layerMat.SetTexture("_Mask",Mask);
|
|
||||||
layerMat.SetTexture("_ValueMask",ValueMask);
|
|
||||||
layerMat.SetColor("_ShadowColor",ShadowColor);
|
|
||||||
layerMat.SetFloat("_ShadowPow",ShadowPow);
|
|
||||||
layerMat.SetFloat("_LayerOffset",i*furOffset);
|
|
||||||
layerMat.SetVector("_FurOffset",FurFore*Mathf.Pow(i*furOffset,FurTenacity)*0.0f);
|
|
||||||
|
|
||||||
layerMat.renderQueue = 3000 + i;
|
|
||||||
//}
|
|
||||||
|
|
||||||
//layer.transform.parent = Target.transform;
|
|
||||||
layers[i] = layer;
|
|
||||||
}
|
|
||||||
//Debug.Log("创建完毕");
|
|
||||||
}
|
|
||||||
|
|
||||||
void UpdateValue()
|
|
||||||
{
|
|
||||||
for (int i = 0; i < layers.Length; i++)
|
|
||||||
{
|
|
||||||
Material layerMat = layers[i].GetComponent<Renderer>().materials[matNum];
|
|
||||||
layerMat.SetFloat("_Value",TValue);
|
|
||||||
mat.SetFloat("_TValue",TValue);
|
|
||||||
//mat.SetFloat("_GValue",GValue);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//删除创建的游戏毛发
|
|
||||||
private void OnDestroy()
|
|
||||||
{
|
|
||||||
// if (layers == null || layers.length == 0)
|
|
||||||
// {
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// for (int i = 0; i < layers.length; i++)
|
|
||||||
// {
|
|
||||||
// destroy(layers[i].gameobject);
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,11 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: 9e31f7b6160cbed41851ac4f758706c8
|
|
||||||
MonoImporter:
|
|
||||||
externalObjects: {}
|
|
||||||
serializedVersion: 2
|
|
||||||
defaultReferences: []
|
|
||||||
executionOrder: 0
|
|
||||||
icon: {instanceID: 0}
|
|
||||||
userData:
|
|
||||||
assetBundleName:
|
|
||||||
assetBundleVariant:
|
|
||||||
@ -26905,7 +26905,8 @@ PrefabInstance:
|
|||||||
propertyPath: m_IsActive
|
propertyPath: m_IsActive
|
||||||
value: 0
|
value: 0
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
m_RemovedComponents: []
|
m_RemovedComponents:
|
||||||
|
- {fileID: 2999783213077156870, guid: e1761819aac3ed74682aa8337a23d32e, type: 3}
|
||||||
m_RemovedGameObjects: []
|
m_RemovedGameObjects: []
|
||||||
m_AddedGameObjects: []
|
m_AddedGameObjects: []
|
||||||
m_AddedComponents:
|
m_AddedComponents:
|
||||||
|
|||||||
@ -78,10 +78,10 @@ AnimationClip:
|
|||||||
m_PreInfinity: 2
|
m_PreInfinity: 2
|
||||||
m_PostInfinity: 2
|
m_PostInfinity: 2
|
||||||
m_RotationOrder: 4
|
m_RotationOrder: 4
|
||||||
attribute: TValue
|
attribute: material._TValue
|
||||||
path:
|
path: Qvan2
|
||||||
classID: 114
|
classID: 23
|
||||||
script: {fileID: 11500000, guid: 9e31f7b6160cbed41851ac4f758706c8, type: 3}
|
script: {fileID: 0}
|
||||||
flags: 0
|
flags: 0
|
||||||
m_PPtrCurves: []
|
m_PPtrCurves: []
|
||||||
m_SampleRate: 24
|
m_SampleRate: 24
|
||||||
@ -174,10 +174,10 @@ AnimationClip:
|
|||||||
m_PreInfinity: 2
|
m_PreInfinity: 2
|
||||||
m_PostInfinity: 2
|
m_PostInfinity: 2
|
||||||
m_RotationOrder: 4
|
m_RotationOrder: 4
|
||||||
attribute: TValue
|
attribute: material._TValue
|
||||||
path:
|
path: Qvan2
|
||||||
classID: 114
|
classID: 23
|
||||||
script: {fileID: 11500000, guid: 9e31f7b6160cbed41851ac4f758706c8, type: 3}
|
script: {fileID: 0}
|
||||||
flags: 0
|
flags: 0
|
||||||
m_EulerEditorCurves: []
|
m_EulerEditorCurves: []
|
||||||
m_HasGenericRootTransform: 0
|
m_HasGenericRootTransform: 0
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user