131 lines
2.8 KiB
C#
131 lines
2.8 KiB
C#
using Obvious.Soap;
|
|
using UFS3;
|
|
using UnityEngine;
|
|
using UnityEngine.Rendering.HighDefinition;
|
|
|
|
public class TentController : MonoBehaviourExtended
|
|
{
|
|
[SerializeField]
|
|
private GameObjectVariable player;
|
|
|
|
[SerializeField]
|
|
private ScriptableEventNoParam OnTeleport;
|
|
|
|
[SerializeField]
|
|
private ScriptableEventItemData OnItemPlaced;
|
|
|
|
[SerializeField]
|
|
private GameObjectVariable eyeObject;
|
|
|
|
[SerializeField]
|
|
private GameObjectVariable placementCamGameObject;
|
|
|
|
[SerializeField]
|
|
private float eulerY;
|
|
|
|
[OwnComponent(0)]
|
|
private Collider collider;
|
|
|
|
[OwnComponent(0)]
|
|
private MeshRenderer meshRenderer;
|
|
|
|
public Transform spawnerPoint;
|
|
|
|
private BaseItemData itemData;
|
|
|
|
private bool isPlacing = true;
|
|
|
|
private bool canPutOnGround;
|
|
|
|
public BaseItemData ItemData
|
|
{
|
|
set
|
|
{
|
|
itemData = value;
|
|
}
|
|
}
|
|
|
|
private void Start()
|
|
{
|
|
EulerYUpdate(eulerY);
|
|
}
|
|
|
|
private void OnEnable()
|
|
{
|
|
OnTeleport.OnRaised += OnTeleport_OnRaised;
|
|
}
|
|
|
|
private void OnTeleport_OnRaised()
|
|
{
|
|
player.Value.transform.SetPositionAndRotation(spawnerPoint.position, Quaternion.identity);
|
|
}
|
|
|
|
private void OnDisable()
|
|
{
|
|
OnTeleport.OnRaised -= OnTeleport_OnRaised;
|
|
}
|
|
|
|
private void EulerYUpdate(float val)
|
|
{
|
|
Vector3 localEulerAngles = base.transform.localEulerAngles;
|
|
localEulerAngles.y = val;
|
|
base.transform.localEulerAngles = localEulerAngles;
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
if (isPlacing)
|
|
{
|
|
float num = 90f * Time.deltaTime;
|
|
if (Input.GetKey(KeyCode.Q))
|
|
{
|
|
eulerY += num;
|
|
EulerYUpdate(eulerY);
|
|
}
|
|
if (Input.GetKey(KeyCode.E))
|
|
{
|
|
eulerY -= num;
|
|
EulerYUpdate(eulerY);
|
|
}
|
|
if (Input.GetKeyDown(KeyCode.F) && canPutOnGround)
|
|
{
|
|
isPlacing = false;
|
|
base.transform.parent = null;
|
|
meshRenderer.material.SetFloat("_SurfaceType", 0f);
|
|
meshRenderer.material.SetColor("_BaseColor", new Color(1f, 1f, 1f, 1f));
|
|
HDMaterial.ValidateMaterial(meshRenderer.material);
|
|
OnItemPlaced.Raise(itemData);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void FixedUpdate()
|
|
{
|
|
if (!isPlacing)
|
|
{
|
|
return;
|
|
}
|
|
Vector3 position = eyeObject.Value.transform.position;
|
|
Vector3 forward = placementCamGameObject.Value.transform.forward;
|
|
canPutOnGround = false;
|
|
if (Physics.Raycast(position, forward, out var hitInfo, 5f, LayerMask.GetMask("Terrain")))
|
|
{
|
|
base.transform.position = hitInfo.point;
|
|
base.transform.rotation = Quaternion.FromToRotation(Vector3.up, hitInfo.normal);
|
|
EulerYUpdate(eulerY);
|
|
if (Physics.OverlapBox(position, collider.bounds.extents / 2f, base.transform.rotation, LayerMask.GetMask("Terrain")).Length != 0)
|
|
{
|
|
meshRenderer.material.SetColor("_BaseColor", new Color(1f, 0f, 0f, 0.5f));
|
|
return;
|
|
}
|
|
meshRenderer.material.SetColor("_BaseColor", new Color(0f, 1f, 0f, 0.5f));
|
|
canPutOnGround = true;
|
|
}
|
|
else
|
|
{
|
|
base.transform.position = position;
|
|
meshRenderer.material.SetColor("_BaseColor", new Color(0f, 0f, 0f, 0.5f));
|
|
}
|
|
}
|
|
}
|