Files
Cielonos/Assets/External VFXs/Hovl Studio/HSFiles/Scripts/For demo scenes/HS_RaycastInstance.cs
SoulliesOfficial 39b43680a9 爆更
2026-07-18 03:16:20 -04:00

147 lines
4.6 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
#if ENABLE_INPUT_SYSTEM
using UnityEngine.InputSystem;
#endif
namespace Hovl
{
public class HS_RaycastInstance : MonoBehaviour
{
public Camera Cam;
public GameObject[] Prefabs;
public float destroyTimer = 1.5f;
private int Prefab;
private Ray RayMouse;
private GameObject Instance;
private float windowDpi;
//Double-click protection
private float buttonSaver = 0f;
void Start()
{
if (Screen.dpi < 1) windowDpi = 1;
if (Screen.dpi < 200) windowDpi = 1;
else windowDpi = Screen.dpi / 200f;
Counter(0);
}
void Update()
{
bool firePressed = false;
#if ENABLE_INPUT_SYSTEM
if (Mouse.current != null)
firePressed = Mouse.current.leftButton.wasPressedThisFrame;
#endif
#if ENABLE_LEGACY_INPUT_MANAGER
if (!firePressed)
firePressed = Input.GetButtonDown("Fire1");
#endif
if (firePressed)
{
if (Cam != null)
{
RaycastHit hit;
Vector3 mousePos = Vector3.zero;
#if ENABLE_INPUT_SYSTEM
if (Mouse.current != null)
mousePos = Mouse.current.position.ReadValue();
else
#endif
#if ENABLE_LEGACY_INPUT_MANAGER
mousePos = Input.mousePosition;
#else
mousePos = Vector3.zero;
#endif
RayMouse = Cam.ScreenPointToRay(mousePos);
if (Physics.Raycast(RayMouse.origin, RayMouse.direction, out hit, 40))
{
Instance = Instantiate(Prefabs[Prefab]);
Instance.transform.position = hit.point + hit.normal * 0.01f;
// Determine destroy time: prefer particle system duration if present, otherwise use destroyTimer
float destroyDelay = destroyTimer;
var particleSystem = Instance.GetComponent<ParticleSystem>();
if (particleSystem != null)
{
var main = particleSystem.main;
float duration = main.duration;
if (duration > 0f)
destroyDelay = duration;
}
Destroy(Instance, destroyDelay);
}
}
else
{
Debug.Log("No camera");
}
}
bool leftPressed = false;
bool rightPressed = false;
#if ENABLE_INPUT_SYSTEM
// keyboard
if (Keyboard.current != null)
{
leftPressed = Keyboard.current.aKey.isPressed || Keyboard.current.leftArrowKey.isPressed;
rightPressed = Keyboard.current.dKey.isPressed || Keyboard.current.rightArrowKey.isPressed;
}
// gamepad horizontal axis fallback
if (!leftPressed && !rightPressed && Gamepad.current != null)
{
float horiz = Gamepad.current.leftStick.x.ReadValue();
leftPressed = horiz < 0f;
rightPressed = horiz > 0f;
}
#endif
#if ENABLE_LEGACY_INPUT_MANAGER
if (!leftPressed)
leftPressed = Input.GetKey(KeyCode.A) || Input.GetAxis("Horizontal") < 0;
if (!rightPressed)
rightPressed = Input.GetKey(KeyCode.D) || Input.GetAxis("Horizontal") > 0;
#endif
if (leftPressed && buttonSaver >= 0.4f)// left button
{
buttonSaver = 0f;
Counter(-1);
}
if (rightPressed && buttonSaver >= 0.4f)// right button
{
buttonSaver = 0f;
Counter(+1);
}
buttonSaver += Time.deltaTime;
}
void OnGUI()
{
GUI.Label(new Rect(10 * windowDpi, 5 * windowDpi, 400 * windowDpi, 20 * windowDpi), "Use the keyboard buttons A/<- and D/-> to change prefabs!");
GUI.Label(new Rect(10 * windowDpi, 20 * windowDpi, 400 * windowDpi, 20 * windowDpi), "Use left mouse button for instancing!");
}
void Counter(int count)
{
Prefab += count;
if (Prefab > Prefabs.Length - 1)
{
Prefab = 0;
}
else if (Prefab < 0)
{
Prefab = Prefabs.Length - 1;
}
}
}
}