OldBlueWater/BlueWater/Assets/02.Scripts/Ai/Unit/UnitController.cs
NTG 42f15c5a6e #8 UnitController 이용한 Ai 그룹화 테스트
- 그룹 상호작용에 따른 하이라이트 효과 적용
1. 마우스 커서 올림 - 하얀색 외곽선
2. 그룹 선택 - 파란색 외곽선

- Arrow, Archer 코루틴 문제 구조 변경
- FieldOfView 인터페이스화
- new input system Unit Action 추가
- GameManager 슬로우모드(부대 선택시) 추가
- Ai 전체 프리팹 stat 수치 변경
- 원거리 이동 중에 공격시 멈추면서 공격하도록 변경
- Layer, ProjectSetting Physics 추가 및변경
2023-08-16 05:36:04 +09:00

109 lines
3.2 KiB
C#

using System;
using System.Collections.Generic;
using UnityEngine;
// ReSharper disable once CheckNamespace
namespace BlueWaterProject
{
public enum UnitType
{
ARCHER_E = 0,
SPEAR_KNIGHT_E,
SPEARMAN_E,
SWORD_KNIGHT_E,
SWORDMAN_E,
ARCHER_P,
AXEMAN_P,
SPEARMAN_P,
SWORD_KNIGHT_P,
SWORDMAN_P,
NONE
}
[Serializable]
public class Unit
{
[Tooltip("부대의 이름")]
public string unitName;
[Tooltip("부대의 종류")]
public UnitType unitType;
[Tooltip("부대의 병력 수")]
public int soliderCount;
[Tooltip("부대 병력 리스트")]
public List<AiController> soldierList;
public Unit()
{
unitName = null;
unitType = UnitType.NONE;
soliderCount = 0;
soldierList = new List<AiController>();
}
public Unit(string unitName, UnitType unitType, int soliderCount, List<AiController> soldierList)
{
this.unitName = unitName;
this.unitType = unitType;
this.soliderCount = soliderCount;
this.soldierList = new List<AiController>(this.soliderCount);
this.soldierList = soldierList;
}
}
public class UnitController : MonoBehaviour
{
public Unit unit;
#if UNITY_EDITOR
private void OnDrawGizmosSelected()
{
if (unit == null || unit.soliderCount <= 0) return;
var unitManager = Application.isPlaying ? GameManager.Inst.UnitManager : FindObjectOfType<UnitManager>();
if (unitManager == null) return;
var matrix = unitManager.UnitMatrices.Find(um => um.soldiers == unit.soliderCount);
if (matrix == null) return;
for (var i = 0; i < unit.soliderCount; i++)
{
var row = i / matrix.columns;
var column = i % matrix.columns;
var xOffset = (column - (matrix.columns - 1) / 2.0f) * 0.5f;
var zOffset = (row - (matrix.rows - 1) / 2.0f) * 0.5f;
var spawnPosition = transform.position + new Vector3(xOffset, 0, zOffset);
var ray = new Ray(spawnPosition, Vector3.down);
Gizmos.color = Physics.Raycast(ray, unitManager.MaxGroundDistance, unitManager.GroundLayer) ? Color.green : Color.red;
Gizmos.DrawRay(ray.origin, ray.direction * unitManager.MaxGroundDistance);
}
}
#endif
[ContextMenu("유닛 생성")]
public void CreateUnit()
{
if (!Application.isPlaying)
{
var unitManager = FindObjectOfType<UnitManager>();
unitManager.CreateUnit(this, unit);
return;
}
GameManager.Inst.UnitManager.CreateUnit(this, unit);
}
public void MoveCommand(Vector3 targetPos)
{
foreach (var soldier in unit.soldierList)
{
soldier.GetNavMeshAgent().SetDestination(targetPos);
}
}
}
}