using BehaviorDesigner.Runtime.Tasks;
using UnityEngine;
namespace BehaviourTree.Brain
{
public class LocateTarget : Action
{
public float Fov;
public float CheckRadius;
public LayerMask TargetMask;
public Bot Bot;
public SharedTarget Target;
public override TaskStatus OnUpdate()
{
var foundTarget = FindTarget(CheckRadius, TargetMask);
if (foundTarget == null) return TaskStatus.Failure;
var eye = new Eye(Fov, Bot.transform);
if (eye.InSight(foundTarget) == false) return TaskStatus.Failure;
Target.Value = foundTarget;
return TaskStatus.Success;
}
private SomeTarget FindTarget(float radius, LayerMask mask)
{
var results = new Collider[64];
SomeTarget target = null;
if (Physics.OverlapSphereNonAlloc(Bot.transform.position, radius, results, mask) == 0) return target;
foreach (var collider in results)
{
if (collider == null) break;
if (collider.TryGetComponent(out SomeTarget found) == false) continue;
target = found;
break;
}
return target;
}
}
}
Да и спотыкаться лучше ему самому
и улучшать код
foreach (GameObject obj in _botsee_cs.GetObjectThatISee())
{
if (obj.GetComponent<IHealth>() != null)
{
if (obj != gameObject)
{
if (obj.GetComponent<IHealth>() != null)
{
if (obj.GetComponent<IHealth>().GetWarSide() != _health.GetWarSide())
{
return obj;
}
}
}
}
}
Публичные поля/свойства/методы get, set это все нарушение иммутабельности/инкапсуляции объекта. Это то же самое, если бы у тебя сердце можно было просто достать рукой и заменить его на другое. Удобно, но это может сделать кто угодно, когда угодно, откуда угодно.
Объект это не мешок с данными и методами для взаимодействия с ними. Взаимодействовать нужно с объектом, а не с данными, которые он содержит.
Как пример:
В этом случае Document просто какое-то DTO(Data transfer object), а не объект, взаимодействие с ним будет соответствующим:
Human взаимодействует с данными, которые содержит Document, а не с самим объектом Document.
И другой пример:
Теперь объект Document иммутабельный. Его текст устанавливается единожды при создании объекта, через конструктор. Изменить это поле нельзя, поэтому он всегда будет сохранять свое состояние. И, благодаря методу Print теперь не нужно взаимодействовать с данными объекта напрямую. Соответственно, теперь взаимодействие будет происходить с объектом, а не с его данными: