ProjectDDD/Assets/External/Epic Toon FX/Demo/Scripts/ETFXFireProjectile.cs
2025-07-08 19:46:31 +09:00

230 lines
7.4 KiB
C#

using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System.Collections;
namespace EpicToonFX
{
public class ETFXFireProjectile : MonoBehaviour
{
public GameObject[] projectiles;
[Header("GUI Links")]
public Text missileNameText; // Reference to the Text object for displaying the missile name.
public UnityEngine.UI.Toggle fullAutoButton;
public Slider speedSlider; // Reference to the Speed Slider UI element
public bool cleanUpMissileName = false;
[Header("Projectile Settings")]
public Transform spawnPosition;
[HideInInspector]
public int currentProjectile = 0;
public float speed = 1000;
public float spawnOffset = 0.3f; // Customizable setting for offset
[Header("Firing Settings")]
public float fireRate = 0.13f;
public bool isFullAuto = true;
[Header("Gun Settings")]
public GameObject gunPrefab; // Reference to the gun prefab
public float gunOffset = 0.5f; // Customizable setting for the gun's offset from the player
private bool canShoot = true;
private GameObject instantiatedGun; // Reference to the instantiated gun
private void Start()
{
if (gunPrefab != null)
{
instantiatedGun = Instantiate(gunPrefab, Vector3.zero, Quaternion.identity);
instantiatedGun.transform.SetParent(transform); // Set the gun's parent to the player
instantiatedGun.transform.localPosition = Vector3.zero; // Reset the local position relative to the player
}
if (speedSlider != null)
{
speedSlider.onValueChanged.AddListener(OnSpeedSliderChanged);
// Set the initial speed value based on the slider's starting value
speed = speedSlider.value;
}
GameObject toggleAutoObject = GameObject.Find("ToggleAuto");
if (toggleAutoObject != null)
{
fullAutoButton = toggleAutoObject.GetComponent<Toggle>();
}
UpdateDisplayName();
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.RightArrow) || Input.GetKeyDown(KeyCode.D))
{
nextEffect();
}
else if (Input.GetKeyDown(KeyCode.A) || Input.GetKeyDown(KeyCode.LeftArrow))
{
previousEffect();
}
if (fullAutoButton != null)
{
isFullAuto = fullAutoButton.isOn;
}
if (instantiatedGun != null) // Add this null check
{
UpdateGunPositionAndRotation();
}
if (isFullAuto)
{
if (canShoot && Input.GetKey(KeyCode.Mouse0))
{
if (!EventSystem.current.IsPointerOverGameObject())
{
StartCoroutine(Shoot());
}
}
}
else
{
if (Input.GetKeyDown(KeyCode.Mouse0))
{
if (!EventSystem.current.IsPointerOverGameObject())
{
ShootProjectile();
}
}
}
if (speedSlider != null)
{
speedSlider.onValueChanged.AddListener(OnSpeedSliderChanged);
// Set the initial speed value based on the slider's starting value
speed = speedSlider.value;
}
Debug.DrawRay(Camera.main.ScreenPointToRay(Input.mousePosition).origin, Camera.main.ScreenPointToRay(Input.mousePosition).direction * 100, Color.yellow);
}
private IEnumerator Shoot()
{
canShoot = false;
ShootProjectile();
yield return new WaitForSeconds(fireRate);
canShoot = true;
}
private void ShootProjectile()
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
Vector3 direction;
if (Physics.Raycast(ray, out RaycastHit hit, 100f))
{
direction = (hit.point - spawnPosition.position).normalized;
}
else
{
direction = ray.direction.normalized;
}
Vector3 spawnPositionWithOffset = spawnPosition.position + direction * spawnOffset;
Quaternion initialRotation = Quaternion.LookRotation(direction);
GameObject projectile = Instantiate(projectiles[currentProjectile], spawnPositionWithOffset, initialRotation);
projectile.GetComponent<Rigidbody>().AddForce(direction * speed);
}
private void UpdateGunPositionAndRotation()
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
Vector3 targetPoint;
if (Physics.Raycast(ray, out hit))
{
targetPoint = hit.point;
}
else
{
targetPoint = ray.origin + ray.direction * 100f;
}
Vector3 directionToMouse = (targetPoint - transform.position).normalized;
float horizontalAngle = Mathf.Atan2(directionToMouse.x, directionToMouse.z) * Mathf.Rad2Deg;
float verticalAngle = -Mathf.Asin(directionToMouse.y / directionToMouse.magnitude) * Mathf.Rad2Deg;
Quaternion targetRotation = Quaternion.Euler(verticalAngle, horizontalAngle, 0f);
if (instantiatedGun != null)
{
instantiatedGun.transform.rotation = Quaternion.Slerp(instantiatedGun.transform.rotation, targetRotation, Time.deltaTime * 10f);
instantiatedGun.transform.position = spawnPosition.position - instantiatedGun.transform.forward * gunOffset;
}
}
public void nextEffect()
{
if (currentProjectile < projectiles.Length - 1)
currentProjectile++;
else
currentProjectile = 0;
UpdateDisplayName();
}
public void previousEffect()
{
if (currentProjectile > 0)
currentProjectile--;
else
currentProjectile = projectiles.Length - 1;
UpdateDisplayName();
}
private void UpdateDisplayName()
{
Text displayText = missileNameText != null ? missileNameText : GetComponentInChildren<Text>();
if (displayText != null)
{
ETFXProjectileScript projectileScript = projectiles[currentProjectile].GetComponent<ETFXProjectileScript>();
string projectileParticleName = projectileScript.projectileParticle.name;
if (cleanUpMissileName)
{
projectileParticleName = CleanUpMissileName(projectileParticleName);
}
displayText.text = $"{projectileParticleName} ({currentProjectile + 1}/{projectiles.Length})";
}
}
private string CleanUpMissileName(string name)
{
// Add a space before certain words in the name
name = name.Replace("Missile", "");
name = name.Replace("Blue", " Blue");
name = name.Replace("Red", " Red");
name = name.Replace("Yellow", " Yellow");
name = name.Replace("Green", " Green");
name = name.Replace("Purple", " Purple");
name = name.Replace("White", " White");
name = name.Replace("Black", " Black");
name = name.Replace("Pink", " Pink");
name = name.Replace("Orange", " Orange");
return name;
}
private void OnSpeedSliderChanged(float value)
{
// Update the speed based on the slider value
speed = value;
}
}
}