154 lines
3.7 KiB
C#
154 lines
3.7 KiB
C#
|
using UnityEngine;
|
|||
|
using System.Collections;
|
|||
|
|
|||
|
|
|||
|
namespace WorldStreamer2
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// Physic culling system.
|
|||
|
/// </summary>
|
|||
|
[RequireComponent(typeof(Rigidbody))]
|
|||
|
public class PhysicCullingSystem : MonoBehaviour
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// The bounding distance - Max view distance is referred from camera to terrain center point.
|
|||
|
/// </summary>
|
|||
|
[Tooltip("Max view distance is referred from camera to terrain center point")]
|
|||
|
public float physicDistance = 10000;
|
|||
|
|
|||
|
float sphereSize = 0.5f;
|
|||
|
|
|||
|
new Rigidbody rigidbody;
|
|||
|
|
|||
|
|
|||
|
CullingGroup group;
|
|||
|
BoundingSphere[] spheres = new BoundingSphere[1000];
|
|||
|
|
|||
|
Camera mainCamera;
|
|||
|
|
|||
|
[HideInInspector] public Vector3 velocity;
|
|||
|
[HideInInspector] public Vector3 angularVelocity;
|
|||
|
|
|||
|
public bool gizmo = true;
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Start this instance, generates culling group and finds terrain.
|
|||
|
/// </summary>
|
|||
|
void Start()
|
|||
|
{
|
|||
|
rigidbody = GetComponent<Rigidbody>();
|
|||
|
|
|||
|
group = new CullingGroup();
|
|||
|
group.targetCamera = Camera.main;
|
|||
|
|
|||
|
spheres[0] = new BoundingSphere(transform.position, sphereSize);
|
|||
|
|
|||
|
|
|||
|
group.SetBoundingSpheres(spheres);
|
|||
|
group.SetBoundingSphereCount(1);
|
|||
|
|
|||
|
group.onStateChanged = StateChangedMethod;
|
|||
|
|
|||
|
|
|||
|
group.SetBoundingDistances(new float[] { physicDistance });
|
|||
|
|
|||
|
mainCamera = Camera.main;
|
|||
|
group.SetDistanceReferencePoint(Camera.main.transform);
|
|||
|
|
|||
|
|
|||
|
Invoke("CheckVisibility", 0.1f);
|
|||
|
}
|
|||
|
|
|||
|
void OnDrawGizmosSelected()
|
|||
|
{
|
|||
|
if (gizmo)
|
|||
|
{
|
|||
|
Gizmos.color = Color.red;
|
|||
|
|
|||
|
Gizmos.DrawWireSphere(transform.position, physicDistance);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Checks visibility by hand
|
|||
|
/// </summary>
|
|||
|
void CheckVisibility()
|
|||
|
{
|
|||
|
bool visible = false || group.GetDistance(0) == 0;
|
|||
|
|
|||
|
|
|||
|
if (!visible)
|
|||
|
{
|
|||
|
StartMovement();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// sets object possition, and checks camera change;
|
|||
|
/// </summary>
|
|||
|
public void Update()
|
|||
|
{
|
|||
|
if (mainCamera != Camera.main)
|
|||
|
{
|
|||
|
mainCamera = Camera.main;
|
|||
|
}
|
|||
|
|
|||
|
group.SetDistanceReferencePoint(Camera.main.transform);
|
|||
|
|
|||
|
spheres[0].position = transform.position;
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Event on cilling group change
|
|||
|
/// </summary>
|
|||
|
/// <param name="evt">Evt.</param>
|
|||
|
private void StateChangedMethod(CullingGroupEvent evt)
|
|||
|
{
|
|||
|
bool visible = false || group.GetDistance(0) == 0;
|
|||
|
|
|||
|
if (visible)
|
|||
|
{
|
|||
|
StopMovement();
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
StartMovement();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Raises the disable event.
|
|||
|
/// </summary>
|
|||
|
void OnDisable()
|
|||
|
{
|
|||
|
if (group != null)
|
|||
|
{
|
|||
|
group.Dispose();
|
|||
|
group = null;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
void StopMovement()
|
|||
|
{
|
|||
|
#if UNITY_6_0 || UNITY_6000
|
|||
|
velocity = rigidbody.linearVelocity;
|
|||
|
#else
|
|||
|
velocity = rigidbody.velocity;
|
|||
|
#endif
|
|||
|
angularVelocity = rigidbody.angularVelocity;
|
|||
|
rigidbody.isKinematic = false;
|
|||
|
}
|
|||
|
|
|||
|
void StartMovement()
|
|||
|
{
|
|||
|
rigidbody.isKinematic = true;
|
|||
|
#if UNITY_6_0 || UNITY_6000
|
|||
|
velocity = rigidbody.linearVelocity;
|
|||
|
#else
|
|||
|
velocity = rigidbody.velocity;
|
|||
|
#endif
|
|||
|
rigidbody.angularVelocity = angularVelocity;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|