You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
1.9 KiB
62 lines
1.9 KiB
2 years ago
|
using System.Collections;
|
||
|
using UnityEngine;
|
||
|
|
||
|
//A simple blobshadow script that rotates and scales based upon the surface normal and distance.
|
||
|
//My aim was to have a cheap solution that runs flawless on mobile cpu's. If you have more cpu power at your disposal i recommend replacing this with a unity projector or a directional light with shadow casting for more accurate results.
|
||
|
public class SimpleBlobShadow : MonoBehaviour {
|
||
|
|
||
|
public Transform FollowBone;
|
||
|
public float BlobShadowSize = 1;
|
||
|
public float DistanceScale = 2f; //the size multiplier of the blobshadow relative to the distance from the floor
|
||
|
public float Yoffset = 0; //the offset of the blobshadow
|
||
|
public LayerMask GroundLayerMask;
|
||
|
public bool followTerrainRotation = true;
|
||
|
private float rayDist = 10f; //raycast distance
|
||
|
|
||
|
void Update(){
|
||
|
if (FollowBone != null) {
|
||
|
|
||
|
//raycast down
|
||
|
RaycastHit hit;
|
||
|
if (Physics.Raycast (FollowBone.transform.position, Vector3.down * rayDist, out hit, rayDist, GroundLayerMask)) {
|
||
|
|
||
|
//show blobshadow if we've hit something
|
||
|
GetComponent<MeshRenderer>().enabled = true;
|
||
|
|
||
|
//set position
|
||
|
setPosition (hit);
|
||
|
|
||
|
//set scale
|
||
|
setScale(FollowBone.transform.position.y - hit.point.y);
|
||
|
|
||
|
//set blobshadow rotation to hit normal
|
||
|
if (followTerrainRotation) {
|
||
|
setRotation(hit.normal);
|
||
|
}
|
||
|
|
||
|
} else {
|
||
|
|
||
|
//hide blobshadow
|
||
|
GetComponent<MeshRenderer>().enabled = false;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//set shadow position
|
||
|
void setPosition(RaycastHit hit){
|
||
|
transform.position = hit.point + Vector3.up * Yoffset;
|
||
|
}
|
||
|
|
||
|
//set shadow rotation to floor angle
|
||
|
void setRotation(Vector3 normal){
|
||
|
transform.rotation = Quaternion.FromToRotation(Vector3.up, normal);
|
||
|
}
|
||
|
|
||
|
//set the scale of the blobshadow
|
||
|
void setScale(float floorDistance){
|
||
|
float scaleMultiplier = floorDistance / DistanceScale;
|
||
|
float size = BlobShadowSize + scaleMultiplier;
|
||
|
transform.localScale = new Vector3 (size, size, size);
|
||
|
}
|
||
|
}
|