Merge branch 'krazerleo/core/1' into lisin/character/1

This commit is contained in:
2022-04-18 17:04:36 +07:00
64 changed files with 1576 additions and 1114 deletions

View File

@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 9fbac871417fccb40831b0f935247a29
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,17 +0,0 @@
using Unity;
using UnityEngine;
public abstract class BaseBehaviour
{
protected NPC thisNPC;
protected IDoActivity DoActivity;
protected BaseBehaviour(NPC npc)
{
thisNPC = npc;
}
public void DoAction()
{
DoActivity?.DoActivity();
}
}

View File

@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 362d340e6754883459f3dc89c9ddc476
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,8 +0,0 @@
public class DumbAttacker : BaseBehaviour
{
public DumbAttacker(NPC npc) : base(npc)
{
DoActivity = new DumbAttackerBehaviour();
}
}

View File

@ -1,7 +0,0 @@
public class DumbDefender : BaseBehaviour
{
public DumbDefender(NPC npc) : base(npc)
{
DoActivity = new DumbDefenderBehaviour();
}
}

View File

@ -1,7 +0,0 @@
public class Human : BaseBehaviour
{
public Human(NPC npc) : base(npc)
{
DoActivity = new HumanBehaviour();
}
}

View File

@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 59d3d253756147e469e418971625a04c
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 93364cc95c8c9764e83d70fcce9da482
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,9 +0,0 @@
using UnityEngine;
class DumbAttackerBehaviour : IDoActivity
{
public void DoActivity()
{
Debug.Log("I do attackers things!");
}
}

View File

@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: d2cc7b0640887454e96d42f6bd066750
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,9 +0,0 @@
using UnityEngine;
class DumbDefenderBehaviour : IDoActivity
{
public void DoActivity()
{
Debug.Log("I do defenders things!");
}
}

View File

@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 27106553be3f26b4da5220e39a3098c3
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,8 +0,0 @@
class HumanBehaviour : IDoActivity
{
public void DoActivity()
{
}
}

View File

@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: d207d14aaf634504e84f3e3bd8b52428
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,4 +0,0 @@
public interface IDoActivity
{
void DoActivity();
}

View File

@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 8e7275817852aa941963daa476581224
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,59 @@
using System.Collections.Generic;
using UnityEngine;
using Unity;
public class CharacterFactory : MonoBehaviour
{
private CharacterFactory instance;
public CharacterFactory Instance { get { return instance; } }
[SerializeField] private List<NavPoint> spawnPointsForDefendersTeam;
[SerializeField] private List<NavPoint> spawnPointsForAttackersTeam;
[SerializeField] private GameObject AIPrefab;
[SerializeField] private GameObject PlayerPrefab;
private List<GameObject> Players;
private void Awake()
{
if (instance == null)
instance = this;
else
Destroy(gameObject);
}
private void Start()
{
var attcNum = SettingsReader.Instance.GetSettings.numOfAttackers;
var defNum = SettingsReader.Instance.GetSettings.numOfDefenders;
var humanDef = SettingsReader.Instance.GetSettings.hasHumanDefender == true ? 1 : 0;
var humanAtc = SettingsReader.Instance.GetSettings.hasHumanAttacker == true ? 1 : 0;
if (humanAtc == 1 && humanDef == 1)
throw new System.ArgumentException("Can be only one human player");
for (int i = 0; i < attcNum - humanAtc; i++)
InstanciateEntity(Team.Attackers, TypeAI.D0DiskAI,
spawnPointsForAttackersTeam[Random.Range(0, spawnPointsForAttackersTeam.Count)]);
for (int i = 0; i < defNum - humanDef; i++)
InstanciateEntity(Team.Defenders, TypeAI.D0DiskAI,
spawnPointsForDefendersTeam[Random.Range(0, spawnPointsForDefendersTeam.Count)]);
if (humanAtc == 1)
InstanciateEntity(Team.Attackers, TypeAI.HumanAI,
spawnPointsForAttackersTeam[Random.Range(0, spawnPointsForAttackersTeam.Count)]);
if (humanDef == 1)
InstanciateEntity(Team.Defenders, TypeAI.HumanAI,
spawnPointsForDefendersTeam[Random.Range(0, spawnPointsForDefendersTeam.Count)]);
}
private void InstanciateEntity(Team team, TypeAI typeAi, NavPoint spawnPoint)
{
var gameobject = GameObject.Instantiate(
typeAi == TypeAI.HumanAI ? PlayerPrefab : AIPrefab,
spawnPoint.position,
Quaternion.identity);
var character = gameObject.GetComponent<ICharacter>();
character.GetCharacter.Team = team;
}
}

View File

@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 93133f9c3db1b944d9120ea789988f9b
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,45 +0,0 @@
public abstract class AbstractCharacterFactory
{
protected IDoActivity behaviour;
protected AbstractCharacterFactory() { }
public abstract BaseBehaviour CreateCharacterBehaviour(NPC npc);
}
public class DumbDefenderFactory : AbstractCharacterFactory
{
public DumbDefenderFactory()
{
behaviour = new DumbDefenderBehaviour();
}
public override BaseBehaviour CreateCharacterBehaviour(NPC npc)
{
return new DumbDefender(npc);
}
}
public class DumbAttackerFactory : AbstractCharacterFactory
{
public DumbAttackerFactory()
{
behaviour = new DumbAttackerBehaviour();
}
public override BaseBehaviour CreateCharacterBehaviour(NPC npc)
{
return new DumbAttacker(npc);
}
}
public class HumanFactory : AbstractCharacterFactory
{
public HumanFactory()
{
behaviour = new HumanBehaviour();
}
public override BaseBehaviour CreateCharacterBehaviour(NPC npc)
{
return new Human(npc);
}
}

View File

@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 4f973f98c4f699745a605d09e2c1e46e
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,55 +0,0 @@
using System.Collections.Generic;
using System;
using UnityEngine;
public class CharacterSpawner : MonoBehaviour
{
[SerializeField] private GameObject botPrefab;
[SerializeField] private List<NavPoint> defendersSpawnPoints;
[SerializeField] private List<NavPoint> attackersSpawnPoints;
private static Dictionary<(TypeAI, Team), Func<NPC, BaseBehaviour>> behaviourDictionary;
private static System.Random random;
public void Start()
{
behaviourDictionary = new Dictionary<(TypeAI, Team), Func<NPC, BaseBehaviour>>()
{
{ (TypeAI.DumbAlgorithm, Team.Attackers), new Func<NPC,BaseBehaviour>( npc => new DumbAttacker(npc))},
{ (TypeAI.DumbAlgorithm, Team.Defenders), new Func<NPC,BaseBehaviour>( npc => new DumbDefender(npc)) },
{ (TypeAI.HumanAI, Team.Defenders), new Func<NPC,BaseBehaviour>( npc => new Human(npc))},
{ (TypeAI.HumanAI, Team.Attackers), new Func<NPC,BaseBehaviour>( npc => new Human(npc))},
//And Other behaviours
};
if (SettingsReader.Instance.GetSettings.hasHumanAttacker && SettingsReader.Instance.GetSettings.hasHumanDefender)
throw new System.Exception("Not allowed to have two players");
else if (SettingsReader.Instance.GetSettings.hasHumanAttacker == true)
{
spawnCharacter(behaviourDictionary[(TypeAI.HumanAI, Team.Attackers)], Team.Attackers);
}
else if (SettingsReader.Instance.GetSettings.hasHumanDefender == true)
{
spawnCharacter(behaviourDictionary[(TypeAI.HumanAI, Team.Defenders)], Team.Defenders);
}
for (int i = 0; i < SettingsReader.Instance.GetSettings.numOfAttackers - (SettingsReader.Instance.GetSettings.hasHumanAttacker ? 1 : 0); i++)
{
spawnCharacter(behaviourDictionary[(SettingsReader.Instance.GetSettings.atcTeamAI, Team.Attackers)], Team.Attackers);
}
for (int i = 0; i < SettingsReader.Instance.GetSettings.numOfAttackers - (SettingsReader.Instance.GetSettings.hasHumanDefender ? 1 : 0); i++)
{
spawnCharacter(behaviourDictionary[(SettingsReader.Instance.GetSettings.defTeamAI, Team.Defenders)], Team.Defenders);
}
}
private void spawnCharacter(Func<NPC, BaseBehaviour> behaviourFunc, Team team)
{
var spawnPoint = team == Team.Defenders ?
defendersSpawnPoints[random.Next(0, defendersSpawnPoints.Count)].position :
attackersSpawnPoints[random.Next(0, attackersSpawnPoints.Count)].position;
var entity = Instantiate(botPrefab, spawnPoint, Quaternion.identity);
var npc = entity.GetComponent<NPC>();
npc.SetBehaviour(behaviourFunc(npc));
}
}

View File

@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 672f5411fc3ccb74d8a17a6efdee9df4
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,4 +0,0 @@
public class CharacterPooler
{
}

View File

@ -0,0 +1,22 @@
using UnityEngine;
public class Character
{
public Team Team { get; set; }
public float LastTimeHit = 0;
public CharacterCondition Condition;
public Character()
{
Condition = new CharacterCondition();
}
public void ResetCharacter()
{
}
}
public interface ICharacter
{
Character GetCharacter { get; }
}

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 64552bae354dc614d8012f07511a51e8
guid: 44d6a17ad31b31241928e1a17e9aba37
MonoImporter:
externalObjects: {}
serializedVersion: 2

View File

@ -1,39 +1,62 @@
using System;
using UnityEngine;
public class CharacterCondition : MonoBehaviour
public class CharacterCondition
{
public event Action<object> OnKilledEvent;
public event Action<int> OnDamageHealthTakenEvent;
public event Action<int> OnDamageArmourTakenEvent;
public event Action<int> OnAmmunitionTakenEvent;
public event Action<int> OnChangeHealthEvent;
public event Action<int> OnChangeArmourEvent;
public event Action<int> OnChangeAmmunitionEvent;
[SerializeField] private int HealthPoints;
[SerializeField] private int ArmourPoints;
[SerializeField] private int Ammunition;
public void Start()
{
private int health;
public int HealthPoints
{
get
{
return health;
}
private set
{
health = value;
OnChangeHealthEvent?.Invoke(value);
}
}
public void GetDamage(float damage)
private int armour;
public int ArmourPoints
{
HealthPoints -= Mathf.RoundToInt(damage * (1 - ArmourPoints * 0.5f));
ArmourPoints -= Mathf.RoundToInt(Mathf.Sqrt(damage) * 5);
OnDamageHealthTakenEvent?.Invoke(HealthPoints);
OnDamageArmourTakenEvent?.Invoke(ArmourPoints);
if (HealthPoints < 0)
OnKilledEvent?.Invoke(gameObject);
get
{
return armour;
}
private set
{
armour = value;
OnChangeArmourEvent?.Invoke(value);
}
}
private int ammo;
public int Ammunition
{
get
{
return ammo;
}
private set
{
ammo = value;
OnChangeAmmunitionEvent?.Invoke(value);
}
}
public CharacterCondition()
{
var settings = SettingsReader.Instance.GetSettings;
ammo = settings.maxAmmo;
health = settings.maxHealth;
armour = settings.maxArmour;
}
public void GiveHealth(int health) => HealthPoints = Mathf.Clamp(health + HealthPoints, 0, 100);
public void SetHealth(int health) => HealthPoints = Mathf.Clamp(health, 0, 100);
public void GiveArmour(int armour) => ArmourPoints = Mathf.Clamp(armour + ArmourPoints, 0, 100);
public void SetArmour(int armour) => ArmourPoints = Mathf.Clamp(armour, 0, 100);
public void TakeAmmo(int ammo)
{
Ammunition += ammo;
OnAmmunitionTakenEvent?.Invoke(Ammunition);
}
public void TakeAmmo(int ammo) => Ammunition += ammo;
}

24
Assets/Scripts/Character/MovementController.cs Executable file → Normal file
View File

@ -7,7 +7,6 @@ using UnityEngine.AI;
public class MovementController : MonoBehaviour
{
public NavPoint currentPosition { get; private set; }
[SerializeField] private MapManager mapManager;
[SerializeField] private NavMeshAgent navMeshAgent;
private void Start()
@ -15,24 +14,19 @@ public class MovementController : MonoBehaviour
navMeshAgent.speed = SettingsReader.Instance.GetSettings.movementSpeed;
}
public void Move()
{
var pointCandidate = getPointCandidate();
goToNextNavPoint(pointCandidate);
public void MoveToRandomPoint()
{
Debug.Log(MapManager.navPoints == null);
goToNextNavPoint(MapManager.navPoints[Random.Range(0, MapManager.navPoints.Count)]);
}
// todo внутри сенсора передавать в mlagents как variable length observations: https://github.com/Unity-Technologies/ml-agents/blob/main/docs/Learning-Environment-Design-Agents.md#variable-length-observations
private NavPoint getPointCandidate()
public List<NavPoint> getPointsCandidate()
{
var NavPointsPositions = mapManager.navPoints
.Select(point => point.transform.position)
.Where(point => (currentPosition.transform.position - point).magnitude <= SettingsReader.Instance.GetSettings.movementSpeed)
return MapManager.navPoints
.Where(point => (currentPosition.position - point.position).magnitude <= SettingsReader.Instance.GetSettings.movementSpeed)
.ToList();
//TODO AI
return null;
}
private void goToNextNavPoint(NavPoint destination) =>
navMeshAgent.SetDestination(destination.transform.position);
public void goToNextNavPoint(NavPoint destination) =>
navMeshAgent.SetDestination(destination.position);
}

118
Assets/Scripts/Character/NPC.cs Executable file → Normal file
View File

@ -1,37 +1,117 @@
using System;
using System.Collections.Generic;
using UnityEngine;
using Unity.MLAgents;
using Unity.MLAgents.Sensors;
using Unity.MLAgents.Actuators;
using System.Collections.Generic;
public class NPC : Agent
[RequireComponent(typeof(MovementController))]
public class NPC : Agent, ICharacter
{
public float LastTimeHit;
private BaseBehaviour NPCBehaviour;
public List<Action> ActionList;
[SerializeField]
private List<ISensor> SensorList; // todo тут интерфейс должен быть наш
[HideInInspector]
public Character AgentCharacter;
public CharacterCondition Condition;
public void SetBehaviour(BaseBehaviour behaviour) => NPCBehaviour = behaviour;
public Team Team { get; set; }
public NPC_BaseState NPC_State { get; private set; }
public Character GetCharacter => AgentCharacter;
private NPC_DirectPointState DirectState;
private NPC_InCoverState CoverState;
private NPC_RunningState RunningState;
private MovementController moveController;
private BufferSensorComponent bufferSensor;
private void Awake()
{
DirectState = new NPC_DirectPointState();
CoverState = new NPC_InCoverState();
RunningState = new NPC_RunningState();
NPC_State = DirectState;
AgentCharacter = new Character();
Condition = AgentCharacter.Condition;
}
private void Start()
{
AgentCharacter = new Character();
Condition = AgentCharacter.Condition;
moveController = gameObject.GetComponent<MovementController>();
bufferSensor = gameObject.GetComponent<BufferSensorComponent>();
GameManager.OnResetScene += AgentCharacter.ResetCharacter;
}
public override void OnEpisodeBegin()
{
}
public override void CollectObservations(VectorSensor sensor)
{
// Target and Agent positions
foreach (var _sensor in SensorList)
sensor.AddObservation(Condition.HealthPoints);
sensor.AddObservation(Condition.ArmourPoints);
sensor.AddObservation(Condition.Ammunition);
sensor.AddObservation((int)NPC_State.State);
var candidates = moveController.getPointsCandidate();
foreach (var point in candidates)
{
sensor.AddObservation(1); // todo
// sensor.AddObservation(_sensor.GetValue());
bufferSensor.AppendObservation(new float[] {
//1 position in navpointId
(float)moveController.currentPosition.PointId,
//2 distance to flag
moveController.currentPosition.FlagDistance,
//3 death count in point
moveController.currentPosition.DeathAttr,
//4 flagEnemyDistance
GameManager.IsCloserToFlagFromNextNavPoint(point, transform.position)==true?1:0,
//5 EnemyVsNavPointDistance
GameManager.IsCloserToEnemyThanToNextNavPoint(point,transform.position, AgentCharacter.Team)==true?1:0
});
}
}
private void Update()
public override void Heuristic(in ActionBuffers actionsOut)
{
//NPCBehaviour.DoAction();
var discreteActionsOut = actionsOut.DiscreteActions;
if (Input.GetKeyDown(KeyCode.W))
{
discreteActionsOut[0] = 1;
}
}
public override void OnActionReceived(ActionBuffers actions)
{
if (actions.DiscreteActions[0] == 1)
{
moveController.MoveToRandomPoint();
NPC_State = RunningState;
}
}
public event Action<object> OnKilledEvent;
public void GetDamage(float damage)
{
AgentCharacter.LastTimeHit = TimeManager.Instance.CurrentTime;
Condition.GiveHealth(-Mathf.RoundToInt(damage * (1 - Condition.ArmourPoints * 0.5f)));
Condition.GiveArmour(-Mathf.RoundToInt(Mathf.Sqrt(damage) * 5));
if (Condition.HealthPoints < 0)
{
OnKilledEvent?.Invoke(this);
moveController.currentPosition.DeathAttr += 1;
}
}
private void OnDestroy()
{
Debug.LogWarning("Pooled object was destroyed");
}
}

View File

@ -0,0 +1,46 @@
public enum NPC_EnumState
{
InCover,
InDirectPoint,
InRunning,
}
public interface NPC_BaseState
{
NPC_EnumState State { get; }
bool InCover { get; }
bool IsRunning { get; }
bool InDirectPoint { get; }
float HitChance { get; }
float DoDamageChance { get; }
}
public class NPC_DirectPointState : NPC_BaseState
{
public bool InCover => false;
public bool IsRunning => false;
public bool InDirectPoint => false;
public float HitChance => SettingsReader.Instance.GetSettings.GetHitChanceInDirectPoint;
public float DoDamageChance => SettingsReader.Instance.GetSettings.DoDamageChanceInDirectPoint;
public NPC_EnumState State => NPC_EnumState.InDirectPoint;
}
public class NPC_RunningState : NPC_BaseState
{
public bool InCover => false;
public bool IsRunning => true;
public bool InDirectPoint => false;
public float HitChance => SettingsReader.Instance.GetSettings.GetHitChanceInRunning;
public float DoDamageChance => SettingsReader.Instance.GetSettings.DoDamageChanceInRunning;
public NPC_EnumState State => NPC_EnumState.InRunning;
}
public class NPC_InCoverState : NPC_BaseState
{
public bool InCover => true;
public bool IsRunning => false;
public bool InDirectPoint => false;
public float HitChance => SettingsReader.Instance.GetSettings.GetHitChanceInCover;
public float DoDamageChance => SettingsReader.Instance.GetSettings.DoDamageChanceInCover;
public NPC_EnumState State => NPC_EnumState.InCover;
}

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 138d13d4fe8a06444acb1da6bfc55aa7
guid: a192e433e26797745ad0b46de2586de3
MonoImporter:
externalObjects: {}
serializedVersion: 2

View File

@ -0,0 +1,34 @@
using System;
using UnityEngine;
public class Player : MonoBehaviour, ICharacter
{
[HideInInspector]
public Character PlayerCharacter;
public CharacterCondition Condition;
public Character GetCharacter => PlayerCharacter;
private void Start()
{
PlayerCharacter = new Character();
Condition = PlayerCharacter.Condition;
GameManager.OnResetScene += PlayerCharacter.ResetCharacter;
}
public event Action<object> OnKilledEvent;
public void GetDamage(float damage)
{
PlayerCharacter.LastTimeHit = TimeManager.Instance.CurrentTime;
Condition.GiveHealth(-Mathf.RoundToInt(damage * (1 - Condition.ArmourPoints * 0.5f)));
Condition.GiveArmour(-Mathf.RoundToInt(Mathf.Sqrt(damage) * 5));
if (Condition.HealthPoints < 0)
OnKilledEvent?.Invoke(this);
}
private void OnDestroy()
{
Debug.LogWarning("Pooled object was destroyed");
}
}

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 60bdb2d866ca9324cbe3639e7c47ae23
guid: a8c9a8e604d395c4ab9d03d28adc4982
MonoImporter:
externalObjects: {}
serializedVersion: 2

View File

@ -1,14 +1,14 @@
using System.Collections;
using System.Collections.Generic;
using UnityEditorInternal;
using Unity.MLAgents;
using UnityEngine;
public class GameManager : MonoBehaviour
{
private static GameManager instance;
public static GameManager Instance { get { return instance; } }
private static SimpleMultiAgentGroup DefendersTeam = new SimpleMultiAgentGroup();
private static SimpleMultiAgentGroup AttackersTeam = new SimpleMultiAgentGroup();
private void Awake()
{
if (Instance == null)
@ -21,13 +21,36 @@ public class GameManager : MonoBehaviour
{
GlobalEventManager.onCaptureFlag += flagCaptured;
GlobalEventManager.onTimeLeft += timeOut;
var agents = GameObject.FindObjectsOfType<Agent>();
foreach (var item in agents)
{
var agent = item as NPC;
if (agent.GetCharacter.Team == Team.Attackers)
AttackersTeam.RegisterAgent(agent);
else
DefendersTeam.RegisterAgent(agent);
}
}
private void Update()
public static bool IsCloserToEnemyThanToNextNavPoint(NavPoint navPoint, Vector3 currentTransform, Team team)
{
SimpleMultiAgentGroup agentGroup;
if (team == Team.Attackers)
agentGroup = AttackersTeam;
else
agentGroup = DefendersTeam;
var distToNavPoint = (currentTransform - navPoint.position).magnitude;
foreach (var agent in agentGroup.GetRegisteredAgents())
if (distToNavPoint > (currentTransform - agent.transform.position).magnitude)
return true;
return false;
}
public static bool IsCloserToFlagFromNextNavPoint(NavPoint navPoint, Vector3 currentTransform)
=> navPoint.FlagDistance < (currentTransform - GameObject.FindGameObjectWithTag("Flag").transform.position).magnitude;
private void flagCaptured(Team team)
{
switch(team)

View File

@ -3,11 +3,17 @@ using UnityEngine;
public class MapManager : MonoBehaviour
{
public List<NavPoint> navPoints { get; private set; }
public static List<NavPoint> navPoints { get; private set; }
private void Start()
{
var i = 0;
navPoints = new List<NavPoint>();
var navPointsGameObj = GameObject.FindGameObjectsWithTag("Point");
foreach (var gameobj in navPointsGameObj)
navPoints.Add(gameobj.GetComponent<NavPoint>());
{
var navpoint = gameobj.GetComponent<NavPoint>();
navpoint.PointId = i; i++;
navPoints.Add(navpoint);
}
}
}

View File

@ -4,8 +4,10 @@ using UnityEngine;
public class TimeManager : MonoBehaviour
{
public static TimeManager instance = null;
public float CurrentTime;
private static TimeManager instance;
public static TimeManager Instance { get { return instance; } }
public float CurrentTime { get; private set; }
void Start()
{
if (instance == null)

View File

@ -17,7 +17,6 @@ public class FlagZone : MonoBehaviour
{
timeForWin = SettingsReader.Instance.GetSettings.timeToWin;
Debug.Log("32");
TimeStayAttackers = 0;
TimeStayDefenders = 0;
occupAttackers = 0;

View File

@ -6,22 +6,15 @@ public class NavPoint : MonoBehaviour
{
public Vector3 position => gameObject.transform.position;
public float FlagDistance { get; private set; }
[System.NonSerialized] public float DeathAttr;
[System.NonSerialized] public List<Vector3> EnemiesSeen;
[HideInInspector]
public int? PointId;
public float DeathAttr = 0;
public List<Vector3> EnemiesSeen = new List<Vector3>();
//Here other attributes;
[SerializeField]
public int PointId;
private void Awake()
{
//DO NOT DELETE
}
private void Start()
{
FlagDistance = (GameObject.FindGameObjectWithTag("Flag").transform.position - position).magnitude;
EnemiesSeen = new List<Vector3>();
DeathAttr = 0;
FlagDistance = (GameObject.FindGameObjectWithTag("Flag").transform.position - position).magnitude;
}
}

View File

@ -3,6 +3,8 @@
[CreateAssetMenu(fileName ="Game Settings", menuName = "Game/Settings", order = 51)]
public class Settings : ScriptableObject
{
public bool isTesting;
public float timeToWin;
public float timeOut;
@ -21,4 +23,15 @@ public class Settings : ScriptableObject
public int armourPickupAmount;
public int ammunitionPickupAmount;
public int pickupsAmount;
public int maxHealth;
public int maxArmour;
public int maxAmmo;
public float GetHitChanceInDirectPoint;
public float GetHitChanceInRunning;
public float GetHitChanceInCover;
public float DoDamageChanceInDirectPoint;
public float DoDamageChanceInRunning;
public float DoDamageChanceInCover;
}

View File

@ -9,7 +9,6 @@ public class SettingsReader : MonoBehaviour
private void Awake()
{
Debug.Log("init");
instance = this;
}

View File

@ -16,6 +16,14 @@ public class PickUpSpawner : MonoBehaviour
[SerializeField] private List<NavPoint> spawnPoints;
private void Awake()
{
if (instance == null)
instance = this;
else
Destroy(gameObject);
}
private void Start()
{
pickups = new List<GameObject>();

View File

@ -1,5 +0,0 @@
public interface ISensor<T>
{
T GetValue();
SensorType GetSensorType();
}

View File

@ -0,0 +1,4 @@
using System.Collections.Generic;
using Unity.MLAgents.Sensors;

View File

View File

@ -739,8 +739,4 @@ public abstract class DictionaryDrawer<TK, TV> : PropertyDrawer
UnityEngine.Debug.Log(e.Message);
}
}
}
[Serializable] public class DictionaryOfTeamsAndNavPoints : SerializableDictionary<Team, NavPoint> { }
[CustomPropertyDrawer(typeof(DictionaryOfTeamsAndNavPoints))]
public class DictionaryOfTeamsAndNavPointsDrawer : DictionaryDrawer<Team, NavPoint> { }
}