Skip to content
This repository has been archived by the owner on Sep 19, 2024. It is now read-only.

Anzeige für Zielselektion des Turms #437

Merged
merged 8 commits into from
Jan 21, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
141 changes: 141 additions & 0 deletions FairyTaleDefender/Assets/_Game/Materials/Target.mat

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions FairyTaleDefender/Assets/_Game/Materials/Target.mat.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions FairyTaleDefender/Assets/_Game/Prefabs/Targets.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

55 changes: 53 additions & 2 deletions FairyTaleDefender/Assets/_Game/Scenes/Managers/Gameplay.unity

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
using System;

namespace BoundfoxStudios.FairyTaleDefender.Entities.Weapons.Targeting
{
public interface ICanTrackTarget
{
event Action TargetChanged;
TargetPoint? Target { get; }
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
using System.Collections.Generic;
using System.Linq;
using BoundfoxStudios.FairyTaleDefender.Common;
using BoundfoxStudios.FairyTaleDefender.Extensions;
using BoundfoxStudios.FairyTaleDefender.Infrastructure.Events.ScriptableObjects;
using UnityEngine;

namespace BoundfoxStudios.FairyTaleDefender.Entities.Weapons.Targeting
{
[AddComponentMenu(Constants.MenuNames.Weapons + "/" + nameof(SelectedWeaponTargetVisualizer))]
public class SelectedWeaponTargetVisualizer : MonoBehaviour
{
[field: SerializeField]
private WeaponSelectedEventChannelSO WeaponSelectedEventChannel { get; set; } = default!;

[field: SerializeField]
private VoidEventChannelSO WeaponDeselectedEventChannel { get; set; } = default!;

[field: SerializeField]
private GameObject TargetVisualizationPrefab { get; set; } = default!;

private readonly List<GameObject> _visualizations = new();
private ICanTrackTarget? _currentTargetTracker;

private void OnEnable()
{
WeaponSelectedEventChannel.Raised += TryToAttachToTrackableTarget;
WeaponDeselectedEventChannel.Raised += TryToDetachFromTrackableTarget;
}

private void OnDisable()
{
WeaponSelectedEventChannel.Raised -= TryToAttachToTrackableTarget;
WeaponDeselectedEventChannel.Raised -= TryToDetachFromTrackableTarget;
}

private void TryToAttachToTrackableTarget(WeaponSelectedEventChannelSO.EventArgs args)
{
// We always need to remove existing visualizations when attaching to a new trackable target.
// If we select one tower and then another tower, there won't be a deselected event, but only a selected one.
RemoveVisualizations();

var targetTracker = args.Transform.GetComponentInChildren<ICanTrackTarget>();

if (targetTracker is null)
{
return;
}

_currentTargetTracker = targetTracker;
_currentTargetTracker.TargetChanged += TargetChanged;


if (targetTracker.Target.Exists())
{
AddVisualizations(targetTracker.Target);
}
}

private void TryToDetachFromTrackableTarget()
{
RemoveVisualizations();

if (_currentTargetTracker != null)
{
_currentTargetTracker.TargetChanged -= TargetChanged;
}

_currentTargetTracker = null;
}

private void TargetChanged()
{
RemoveVisualizations();

// It could be that we're changing the target, but it was just destroyed.
if (_currentTargetTracker != null && _currentTargetTracker.Target.Exists())
{
AddVisualizations(_currentTargetTracker.Target);
}
}

private void RemoveVisualizations()
{
var existingVisualizations = _visualizations.Where(v => v.Exists()).ToArray();

foreach (var visualization in existingVisualizations)
{
Destroy(visualization);
}

_visualizations.Clear();
}

private void AddVisualizations(TargetPoint targetPoint)
{
var enemyTransform = targetPoint.Enemy.transform;

var visualization = Instantiate(TargetVisualizationPrefab, enemyTransform);
_visualizations.Add(visualization);
}
}
}
Original file line number Diff line number Diff line change
@@ -14,7 +14,8 @@ namespace BoundfoxStudios.FairyTaleDefender.Entities.Weapons
[SelectionBase]
public abstract class Weapon<TWeaponSO, TTargetLocatorSO, TEffectiveWeaponDefinition> : MonoBehaviour,
ICanCalculateEffectiveWeaponDefinition,
ICanChangeTargetType
ICanChangeTargetType,
ICanTrackTarget
where TWeaponSO : WeaponSO
where TTargetLocatorSO : TargetLocatorSO<TEffectiveWeaponDefinition>
where TEffectiveWeaponDefinition : EffectiveWeaponDefinition
@@ -59,6 +60,9 @@ public abstract class Weapon<TWeaponSO, TTargetLocatorSO, TEffectiveWeaponDefini
/// </summary>
protected abstract void TrackTarget(TargetPoint target);

public event Action? TargetChanged;
public TargetPoint? Target => _currentTarget;

private TEffectiveWeaponDefinition? _effectiveWeaponDefinition;
private TargetPoint? _currentTarget;
private Vector3 _towerForward;
@@ -78,6 +82,8 @@ public EffectiveWeaponDefinition CalculateEffectiveWeaponDefinition(Vector3 posi

protected virtual void Update()
{
var previousTarget = _currentTarget;

if (!_currentTarget && !TryAcquireTarget(out _currentTarget))
{
return;
@@ -87,10 +93,16 @@ protected virtual void Update()

if (!isTargetInRangeAndAlive)
{
TargetChanged?.Invoke();
_currentTarget = null;
return;
}

if (previousTarget != _currentTarget)
{
TargetChanged?.Invoke();
}

TrackTarget(_currentTarget!);
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2,329 changes: 2,329 additions & 0 deletions FairyTaleDefender/Assets/_Game/Shaders/Ring_Shader.shadergraph

Large diffs are not rendered by default.