Skip to content

Commit 9b8496c

Browse files
Incorporated optimizations to DaggerfallMissile and WeaponManager from #2770 as well as the WeaponManager layer mask fix. Removed the explicit exclusion of IgnoreRaycast layer from the layer mask initialization because DefaultRaycastLayer apparently already excludes it.
1 parent a581e30 commit 9b8496c

2 files changed

Lines changed: 81 additions & 37 deletions

File tree

Assets/Scripts/Game/DaggerfallMissile.cs

Lines changed: 75 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,18 @@ public class DaggerfallMissile : MonoBehaviour
6161
public const float SphereCastRadius = 0.25f;
6262
public const float TouchRange = 3.0f;
6363

64+
private static readonly Collider[] aoeBuffer = new Collider[64];
65+
private readonly List<DaggerfallEntityBehaviour> tmpTargets = new List<DaggerfallEntityBehaviour>(32);
66+
67+
// Cached references
68+
private GameManager gm;
69+
private Camera mainCamera;
70+
private WeaponManager weaponManager;
71+
private Collider casterCollider;
72+
private EnemySenses cachedEnemySenses;
73+
private EnemyAttack cachedEnemyAttack;
74+
private CharacterController casterController;
75+
6476
Vector3 colliderPosition;
6577

6678
Vector3 direction;
@@ -170,39 +182,53 @@ public DaggerfallEntityBehaviour[] Targets
170182
private void Awake()
171183
{
172184
audioSource = transform.GetComponent<DaggerfallAudioSource>();
185+
186+
gm = GameManager.Instance;
187+
mainCamera = gm.MainCamera;
188+
weaponManager = gm.WeaponManager;
189+
audioSource = GetComponent<DaggerfallAudioSource>();
173190
}
174191

175192
private void Start()
176193
{
177194
// Setup light and shadows
178195
myLight = GetComponent<Light>();
179-
myLight.enabled = EnableLight;
196+
myLight.enabled = EnableLight && DaggerfallUnity.Settings.EnableSpellLighting;
180197
forceDisableSpellLighting = !DaggerfallUnity.Settings.EnableSpellLighting;
181-
if (forceDisableSpellLighting) myLight.enabled = false;
182-
if (!DaggerfallUnity.Settings.EnableSpellShadows) myLight.shadows = LightShadows.None;
198+
if (!DaggerfallUnity.Settings.EnableSpellShadows)
199+
{
200+
myLight.shadows = LightShadows.None;
201+
}
202+
183203
initialRange = myLight.range;
184204
initialIntensity = myLight.intensity;
185205

186206
// Use payload when available
187207
if (payload != null)
188208
{
189-
// Set payload missile properties
190209
caster = payload.CasterEntityBehaviour;
191210
targetType = payload.Settings.TargetType;
192211
elementType = payload.Settings.ElementType;
193212

194213
// Set spell billboard anims automatically from payload for mobile missiles
195-
if (targetType == TargetTypes.SingleTargetAtRange ||
196-
targetType == TargetTypes.AreaAtRange)
214+
if (targetType == TargetTypes.SingleTargetAtRange || targetType == TargetTypes.AreaAtRange)
197215
{
198216
UseSpellBillboardAnims();
199217
}
200218
}
201219

202220
// Setup senses
203-
if (caster && caster != GameManager.Instance.PlayerEntityBehaviour)
221+
if (caster)
204222
{
205-
enemySenses = caster.GetComponent<EnemySenses>();
223+
casterCollider = caster.GetComponent<Collider>();
224+
cachedEnemySenses = caster.GetComponent<EnemySenses>();
225+
cachedEnemyAttack = caster.GetComponent<EnemyAttack>();
226+
casterController = caster.GetComponent<CharacterController>();
227+
}
228+
229+
if (caster && caster != gm.PlayerEntityBehaviour)
230+
{
231+
enemySenses = cachedEnemySenses;
206232
}
207233

208234
// Setup arrow
@@ -230,13 +256,11 @@ private void Start()
230256
static void InitializeLayerMasks()
231257
{
232258
layerMaskDefault = Physics.DefaultRaycastLayers;
233-
layerMaskDefault &= ~(1 << Physics.IgnoreRaycastLayer);
234259
layerMaskDefault &= ~(1 << LayerMask.NameToLayer("Automap"));
235260

236261
layerMaskPlayer = Physics.DefaultRaycastLayers;
237-
layerMaskPlayer &= ~(1 << Physics.IgnoreRaycastLayer);
238-
layerMaskPlayer &= ~(1 << LayerMask.NameToLayer("Player"));
239262
layerMaskPlayer &= ~(1 << LayerMask.NameToLayer("Automap"));
263+
layerMaskPlayer &= ~(1 << LayerMask.NameToLayer("Player"));
240264
}
241265

242266
private void Update()
@@ -398,10 +422,12 @@ public static DaggerfallEntityBehaviour GetEntityTargetInTouchRange(Vector3 aimP
398422
// Origin point of ray is set back slightly to fix issue where strikes against target capsules touching caster capsule do not connect
399423
RaycastHit hit;
400424
Ray ray = new Ray(aimPosition, aimDirection);
401-
if (Physics.SphereCast(ray, SphereCastRadius, out hit, TouchRange, layerMaskTouch))
425+
if (Physics.SphereCast(ray, SphereCastRadius, out hit, TouchRange, layerMaskTouch, QueryTriggerInteraction.Ignore))
426+
{
402427
return hit.transform.GetComponent<DaggerfallEntityBehaviour>();
403-
else
404-
return null;
428+
}
429+
430+
return null;
405431
}
406432

407433
#endregion
@@ -437,29 +463,34 @@ void DoMissile()
437463
// AOE can strike any number of targets within range with an option to exclude caster
438464
void DoAreaOfEffect(Vector3 position, bool ignoreCaster = false)
439465
{
440-
List<DaggerfallEntityBehaviour> entities = new List<DaggerfallEntityBehaviour>();
441-
442466
colliderPosition = position;
443467

444-
// Collect AOE targets and ignore duplicates
445-
Collider[] overlaps = Physics.OverlapSphere(position, ExplosionRadius);
446-
for (int i = 0; i < overlaps.Length; i++)
468+
int count = Physics.OverlapSphereNonAlloc(position, ExplosionRadius, aoeBuffer, layerMaskDefault, QueryTriggerInteraction.Ignore);
469+
tmpTargets.Clear();
470+
471+
for (int i = 0; i < count; i++)
447472
{
448-
DaggerfallEntityBehaviour aoeEntity = overlaps[i].GetComponent<DaggerfallEntityBehaviour>();
473+
var beh = aoeBuffer[i].GetComponent<DaggerfallEntityBehaviour>();
474+
if (!beh)
475+
{
476+
continue;
477+
}
449478

450-
if (ignoreCaster && aoeEntity == caster)
479+
if (ignoreCaster && beh == caster)
480+
{
451481
continue;
482+
}
452483

453-
if (aoeEntity && !targetEntities.Contains(aoeEntity))
484+
if (!targetEntities.Contains(beh))
454485
{
455-
entities.Add(aoeEntity);
456-
//Debug.LogFormat("Missile hit target {0} by AOE", aoeEntity.name);
486+
tmpTargets.Add(beh);
457487
}
458488
}
459489

460-
// Add collection to target entities
461-
if (entities.Count > 0)
462-
targetEntities.AddRange(entities);
490+
if (tmpTargets.Count > 0)
491+
{
492+
targetEntities.AddRange(tmpTargets);
493+
}
463494

464495
impactDetected = true;
465496
missileReleased = true;
@@ -485,21 +516,24 @@ Vector3 GetAimPosition()
485516
{
486517
// Offset up so it comes from same place LOS check is done from
487518
Vector3 adjust;
488-
if (caster != GameManager.Instance.PlayerEntityBehaviour)
519+
if (caster != gm.PlayerEntityBehaviour)
489520
{
490-
CharacterController controller = caster.transform.GetComponent<CharacterController>();
491521
adjust = caster.transform.forward * 0.6f;
492-
adjust.y += controller.height / 3;
522+
if (casterController)
523+
{
524+
adjust.y += casterController.height / 3;
525+
}
493526
}
494527
else
495528
{
496529
// Adjust slightly downward to match bow animation
497-
adjust = (GameManager.Instance.MainCamera.transform.rotation * -Caster.transform.up) * 0.11f;
530+
adjust = (gm.MainCamera.transform.rotation * -caster.transform.up) * 0.11f;
498531
// Adjust to the right or left to match bow animation
499-
if (!GameManager.Instance.WeaponManager.ScreenWeapon.FlipHorizontal)
500-
adjust += GameManager.Instance.MainCamera.transform.right * 0.15f;
532+
var right = gm.MainCamera.transform.right * 0.15f;
533+
if (!gm.WeaponManager.ScreenWeapon.FlipHorizontal)
534+
adjust += right;
501535
else
502-
adjust -= GameManager.Instance.MainCamera.transform.right * 0.15f;
536+
adjust -= right;
503537
}
504538
aimPosition += adjust;
505539
}
@@ -631,7 +665,13 @@ void AssignBowDamageToTarget(Collider arrowHitCollider)
631665
else
632666
{
633667
Transform hitTransform = arrowHitCollider.gameObject.transform;
634-
GameManager.Instance.WeaponManager.WeaponDamage(GameManager.Instance.WeaponManager.LastBowUsed, true, isArrowSummoned, hitTransform, hitTransform.position, goModel.transform.forward);
668+
GameManager.Instance.WeaponManager.WeaponDamage(
669+
GameManager.Instance.WeaponManager.LastBowUsed,
670+
true,
671+
isArrowSummoned,
672+
hitTransform,
673+
hitTransform.position,
674+
goModel.transform.forward);
635675
}
636676
}
637677

Assets/Scripts/Game/WeaponManager.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -196,9 +196,13 @@ void Start()
196196
//weaponSensitivity = DaggerfallUnity.Settings.WeaponSensitivity;
197197
mainCamera = GameObject.FindGameObjectWithTag("MainCamera");
198198
player = transform.gameObject;
199-
playerLayerMask = ~(1 << LayerMask.NameToLayer("Player"));
199+
200+
playerLayerMask = Physics.DefaultRaycastLayers;
201+
playerLayerMask &= ~(1 << LayerMask.NameToLayer("Player"));
202+
playerLayerMask &= ~(1 << LayerMask.NameToLayer("Automap"));
203+
200204
_gesture = new Gesture();
201-
_longestDim = Math.Max(Screen.width, Screen.height);
205+
_longestDim = Mathf.Max(Screen.width, Screen.height);
202206
SetMelee(ScreenWeapon);
203207
}
204208

0 commit comments

Comments
 (0)