You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
93 lines
2.2 KiB
C#
93 lines
2.2 KiB
C#
using Fusion;
|
|
using UnityEngine;
|
|
|
|
namespace Projectiles
|
|
{
|
|
public class ProjectileContext
|
|
{
|
|
public NetworkRunner Runner;
|
|
public ObjectCache Cache;
|
|
public PlayerRef Owner;
|
|
// Barrel transform represents position from which projectile visuals should fly out
|
|
// (actual projectile fire calculations are usually done from different point, for example camera)
|
|
public Transform[] BarrelTransforms;
|
|
}
|
|
|
|
/// <summary>
|
|
/// A common base for all projectiles.
|
|
/// </summary>
|
|
public abstract class ProjectileBase: MonoBehaviour
|
|
{
|
|
// PUBLIC MEMBERS
|
|
|
|
public ProjectileContext Context { get; set; }
|
|
|
|
// PRIVATE MEMBERS
|
|
|
|
[SerializeField]
|
|
private GameObject _impactEffectPrefab;
|
|
[SerializeField]
|
|
private float _impactEffectReturnTime = 2f;
|
|
[SerializeField, Tooltip("Standalone effect that will be spawned through NetworkRunner")]
|
|
private NetworkObject _impactObjectPrefab;
|
|
|
|
private TrailRenderer[] _trails;
|
|
|
|
// MONOBEHAVIOR
|
|
|
|
protected virtual void Awake()
|
|
{
|
|
_trails = GetComponentsInChildren<TrailRenderer>(true);
|
|
}
|
|
|
|
protected void OnDisable()
|
|
{
|
|
for (int i = 0; i < _trails.Length; i++)
|
|
{
|
|
_trails[i].Clear();
|
|
}
|
|
}
|
|
|
|
// PROTECTED METHODS
|
|
|
|
protected void SpawnImpact(Vector3 position, Vector3 normal)
|
|
{
|
|
if (Context.Runner.Stage == default)
|
|
{
|
|
Debug.LogError("Call SpawnImpact only from simulation(Spawned, FUN) methods!");
|
|
return;
|
|
}
|
|
|
|
if (position == Vector3.zero)
|
|
return;
|
|
|
|
if (_impactObjectPrefab != null && Context.Runner.IsServer == true)
|
|
{
|
|
Context.Runner.Spawn(_impactObjectPrefab, position, Quaternion.LookRotation(normal), Context.Owner);
|
|
}
|
|
}
|
|
|
|
protected void SpawnImpactVisual(Vector3 position, Vector3 normal)
|
|
{
|
|
if (Context.Runner.Stage != default)
|
|
{
|
|
Debug.LogError("Call SpawnImpactVisual only from Render-related methods!");
|
|
return;
|
|
}
|
|
|
|
if (position == Vector3.zero)
|
|
return;
|
|
|
|
if (_impactEffectPrefab != null)
|
|
{
|
|
var impact = Context.Cache.Get(_impactEffectPrefab);
|
|
|
|
impact.transform.SetPositionAndRotation(position, Quaternion.LookRotation(normal));
|
|
Context.Runner.MoveToRunnerScene(impact);
|
|
|
|
Context.Cache.ReturnDeferred(impact, _impactEffectReturnTime);
|
|
}
|
|
}
|
|
}
|
|
}
|