ProjectDDD/Assets/Plugins/AllIn1VfxToolkit/Demo & Assets/Demo/Scripts/AllIn1DemoProjectile.cs
2025-07-08 19:46:31 +09:00

51 lines
1.9 KiB
C#

using UnityEngine;
namespace AllIn1VfxToolkit.Demo.Scripts
{
public class AllIn1DemoProjectile : MonoBehaviour
{
[SerializeField] private float inaccurateAmount = 0.05f;
private GameObject currentImpactPrefab;
private Transform currentHierarchyParent;
private bool doImpactSpawn;
private bool doShake = false;
private float shakeAmountOnImpact, impactScaleSize;
public void Initialize(Transform hierarchyParent, Vector3 projectileDir, float speed, GameObject impactPrefab, float impactScaleSize)
{
currentHierarchyParent = hierarchyParent;
currentImpactPrefab = impactPrefab;
doImpactSpawn = currentImpactPrefab != null;
this.impactScaleSize = impactScaleSize;
ApplyPrecisionOffsetToProjectileDir(ref projectileDir);
GetComponent<Rigidbody>().linearVelocity = projectileDir * speed;
}
public void AddScreenShakeOnImpact(float projectileImpactShakeAmount)
{
doShake = true;
shakeAmountOnImpact = projectileImpactShakeAmount;
}
private void ApplyPrecisionOffsetToProjectileDir(ref Vector3 projectileDir)
{
projectileDir.x += Random.Range(-inaccurateAmount, inaccurateAmount);
projectileDir.y += Random.Range(-inaccurateAmount, inaccurateAmount);
projectileDir.z += Random.Range(-inaccurateAmount, inaccurateAmount);
}
private void OnTriggerEnter(Collider other)
{
if(doImpactSpawn)
{
Transform t = Instantiate(currentImpactPrefab, transform.position, Quaternion.identity).transform;
t.parent = currentHierarchyParent;
t.localScale *= impactScaleSize;
}
if(doShake) AllIn1Shaker.i.DoCameraShake(shakeAmountOnImpact);
Destroy(gameObject);
}
}
}