Щас покажу панковский метод:
Скрипт отвечающий и за выделение монстра, и за построение\удаление сетки
полигонов меша внутри ассета, с учётом массива проходимости ячеек:
[предупреждаю - есть мусор, оставленный от предыдущих версий, и тестов - на езду не влияет ))]
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using UnityEngine;
public class SetkaHodaMonstra : MonoBehaviour
{
public GameObject SetkaMobile;
public Mesh SetkaDvij2;
public GameObject Monster; //Монстр, которого будем двигать
public GameObject TipaMonster; //Тело монстра в которого будем тыкать мышкой
public Camera camera_n; //Камера конечно
private Vector3 RaycastPickCoordinates; //Конечные координаты падения луча в рейкасте на коллайдер
private string RaycastObjNow; // Текстовая переменная, содержит имя объекта коллайдер которого попал под луч
private int TimeFlow; //Состояние времени
private int SetkaDvijCreator = 0;
private int SetkaDestroyer = 0;
private int mxi;
private int mzi;
public int Stime; // Количество прокруток цикла высчитывающего X координату ячейки
private int SetcaCreate = 0;
private Vector3 Pickposition;
private Vector3 PickpositionS;
private int[,] MonHodMass;
private int[] MonHodYachMass;
private int SetkaMonHodX = 5;
private int SetkaMonHodZ = 5;
private int PloshMonHodXZ;
private int Xcount = 0;
private int UniversalCounter = 0; //Универсальный многоразовый счётчик для разных задачь
private int UniversalCounter2 = 0; //Универсальный многоразовый счётчик для разных задачь
private int UniversalCounter3 = 0; //Универсальный многоразовый счётчик для разных задачь
private int Zcounter = 0;
private float SetkaDvijScaleZ; //Размер сетки по оси "Z". - В флоатах
private float SetkaDvijScaleX; //размер сетки по оси "X". - В флоатах
private int SetkaDvijScaleZconstant; //Размер сетки по оси "Z". - Постоянная велечина
private int SetkaDvijScaleXconstant; //размер сетки по оси "X". - Постоянная велечина
private int SetkaDvijScaleZ2; //Размер сетки по оси "Z". - В интеджерах
private int SetkaDvijScaleX2; //размер сетки по оси "X". - В интеджерах
private int SetcaDvijPloshad2 = 0; //Площадь сетки.
private int PloshCraft;
private int[] PloshCraftMass;
private int PloshCraftMassCounter = 0;
private int PloshCraftFor = 0;
private int PloX = 0;
private int PloZ = 1;
private int Perebor = 0;
private int SetkaScaleControl = 0;
private int ZDvij = 0;
private int XDvij = 0;
private int UDvij = 0;
private int VSPX;
private int VSPZ;
private int TESTE = 0;
private int SPK;
private Vector3[] Vershini1;
private int[] Bermudes1;
private Vector2[] TextureCoordinates;
private int VK = 0;
private int BR = 0;
private int SDVIG = 0;
private int SDVIG2 = 1;
private int SDVIGX = 0;
private int SDVIGX2 = 0;
private int SDVIGFUCK = 0;
private int ZERO = 0; // Просто ноль, по тому, что мне нужен ноль.
private int MonCorZ;
private int MonCorX;
private int SX;
private int MHCleanerX = 0;
private int MHCleanerZ = 0;
public int MonsterNumber; //Порядковый номер монстра
public int ThreatLevel; //Уровень угрозы монстра
public int MonsterControl; //Уровень угрозы монстра
public MonsterInfo MI; //Скрипт монстра MonsterInfo
private int ProgonScripta = 0;
private int StatusVideleniya = 0;
private float BermudesTimer;
void Start()
{
camera_n = Camera.main;
TimeFlow = GLOBALSUPERSCRIPT.TimeFlow; //Получаем значение состояния времени
SetkaMobile.transform.position = new Vector3(0f, 0f, 0f);
}
void Update()
{
SetcaDvijPloshad2 = SetkaDvijScaleZ2 * SetkaDvijScaleX2;
PloshCraft = SetcaDvijPloshad2;
MonHodMass = new int[(SetkaDvijScaleX2 * SetkaDvijScaleZ2) + 1, SetkaDvijScaleZ2 + 1 + SetkaMonHodZ];
if (SetkaScaleControl == 0)
{
if (GLOBALSUPERSCRIPT.LevelScaleStatus == 1)
{
SetkaDvijScaleX = GLOBALSUPERSCRIPT.LevelScaleX;
SetkaDvijScaleZ = GLOBALSUPERSCRIPT.LevelScaleZ;
SetkaDvijScaleXconstant = Mathf.FloorToInt(SetkaDvijScaleX);
SetkaDvijScaleZconstant = Mathf.FloorToInt(SetkaDvijScaleZ);
SetkaDvijScaleX2 = SetkaDvijScaleXconstant;
SetkaDvijScaleZ2 = SetkaDvijScaleZconstant;
//Расчёт площади сетки.
SetcaDvijPloshad2 = SetkaDvijScaleZ2 * SetkaDvijScaleX2;
PloshCraft = SetcaDvijPloshad2;
PloshCraftMass = new int[PloshCraft];
MonHodYachMass = new int[PloshCraft];
Vershini1 = new Vector3[(SetcaDvijPloshad2 * 6)];
Bermudes1 = new int[(SetcaDvijPloshad2 * 6)];
TextureCoordinates = new Vector2[(SetcaDvijPloshad2 * 6)];
SetkaScaleControl = 1;
}
}
if (TESTE == 0)
{
if (SetkaScaleControl == 1)
{
if (SetkaPassabilityControl.SetkaScaleControl == 3)
{
TESTE = 1;
SetkaScaleControl = 2;
SPK = 3;
}
}
}
//------------------------------------------------------------------------------------------------------------------------------------
if (ProgonScripta == 2)
{
ProgonScripta = ProgonScripta = 0;
}
if (StatusVideleniya == 2)
{
StatusVideleniya = 0;
ProgonScripta = 0;
}
//Если нажата ЛКМ
if (Input.GetMouseButtonDown(0) || ProgonScripta == 1)
{
Debug.Log("ProgonScripta:" + ProgonScripta);
MonsterControl = MI.MonsterControl; // Статус выделения монстра, по умолчанию "0" не выделен.
//Сам луч, начинается от позиции камеры и направлен в сторону мыши
Ray ray = camera_n.ScreenPointToRay(Input.mousePosition);
//Структура луча, нужна для получения информации из Raycast
RaycastHit PickRay;
//Пускаем луч
Physics.Raycast(ray, out PickRay);
Debug.DrawLine(ray.origin, PickRay.point, Color.red);
SetkaDvijScaleX2 = SetkaDvijScaleXconstant;
SetkaDvijScaleZ2 = SetkaDvijScaleZconstant;
if (SetkaDestroyer == 1 && SetkaDvijCreator == 3)
{
SetkaDvijCreator = 0;
SetkaDestroyer = 0;
}
if (SetkaDestroyer == 1 && StatusVideleniya == 1)
{
SetkaDvijCreator = 3;
Destroy(GetComponent<MeshFilter>().mesh);
Destroy(GetComponent<MeshCollider>());
mxi = 0;
mzi = 0;
MonCorZ = 0; //Z координаты монстра
MonCorX = 0; //X координаты монстра
FightScene.SkillPanelSower = 3;
StatusVideleniya = 2;
}
//Если запустили луч
if (Physics.Raycast(ray, out PickRay) && FightScene.MonsterVidelStatus == 0)
{
//Получаем координаты пика на коллайдере
RaycastPickCoordinates = new Vector3(PickRay.point.x, PickRay.point.y, PickRay.point.z);
//Пишем в RaycastObjNow и дебаггер конкретно во что воткнулся луч
RaycastObjNow = PickRay.collider.name;
if (PickRay.transform.gameObject == TipaMonster)
{
MI.MonsterControl = 1;
}
//Если луч попал в SetkaMobile монстра
if (PickRay.transform.gameObject == SetkaMobile && MI.MonsterControl == 1 && SetkaDestroyer == 1)
{
if (UnityEngine.EventSystems.EventSystem.current.IsPointerOverGameObject() == false)
{
// Высчитываем квадрат, куда движется монстр, чтобы сделать его непроходимым.
Stime = Mathf.FloorToInt(PickRay.point.x) - 1;
for (ZERO = 0; ZERO < Stime; Stime--)
{
SX = SX + SetkaDvijScaleZconstant;
}
if (Mathf.FloorToInt(PickRay.point.x) - 1 < 0)
{
SX = SX - SetkaDvijScaleZconstant;
}
SetkaPassabilityControl.Setka[SX + SetkaDvijScaleZconstant, Mathf.FloorToInt(PickRay.point.z) + 1] = 1; // Непроходимый квадрат
SX = 0;
Stime = 0;
//------------------------------------------------------------------------------
// Высчитываем квадрат, куда движется монстр, чтобы сделать его проходимым.
Pickposition = TipaMonster.transform.position;
Stime = Mathf.FloorToInt(Mathf.Floor(Pickposition.x)) - 1;
for (ZERO = 0; ZERO < Stime; Stime--)
{
SX = SX + SetkaDvijScaleZconstant;
}
if (Mathf.FloorToInt(Mathf.Floor(Pickposition.x)) - 1 < 0)
{
SX = SX - SetkaDvijScaleZconstant;
}
SetkaPassabilityControl.Setka[SX + SetkaDvijScaleZconstant, Mathf.FloorToInt(Pickposition.z) + 1] = 0; // Проходимый квадрат
SX = 0;
Stime = 0;
//------------------------------------------------------------------------------
if (MI.MonsterControl == 1)
{
Monster.transform.position = new Vector3(Mathf.Floor(PickRay.point.x) + 0.5f, 0, Mathf.Floor(PickRay.point.z) + 0.5f);
MI.MonsterControl = 0;
}
SetkaMobile.transform.position = new Vector3(0, 0, 0);
//Обнуляем RaycastObjNow
RaycastObjNow = "NiHuYa";
MI.MonsterControl = 0;
}
}
}
if (ProgonScripta == 1 && StatusVideleniya == 0)
{
ProgonScripta = 2;
if (TESTE == 1)
{
if (Physics.Raycast(ray, out PickRay))
{
if (PickRay.transform.gameObject == TipaMonster && FightScene.SkillActive == 0)
{
if (SetkaDvijCreator == 0 && MI.MonsterControl == 1)
{
if (UnityEngine.EventSystems.EventSystem.current.IsPointerOverGameObject() == false)
{
SetkaDvijCreator = 1;
SetkaDestroyer = 1;
//Расчёт площади сетки.
SetcaDvijPloshad2 = SetkaDvijScaleZ2 * SetkaDvijScaleX2;
PloshCraft = SetcaDvijPloshad2;
Perebor = SetcaDvijPloshad2 - 1;
PloshCraftMassCounter = 0;
PloX = 0;
PloZ = 1;
for (PloshCraftFor = 0; PloshCraftFor < PloshCraft; PloshCraft--)
{
PloshCraftMass[PloshCraftMassCounter] = SetkaPassabilityControl.Setka[PloX, PloZ];
PloshCraftMassCounter = PloshCraftMassCounter + 1;
PloZ = PloZ + 1;
if (PloZ > SetkaDvijScaleZ2)
{
PloZ = 1;
PloX = PloX + SetkaDvijScaleZ2;
}
}
PloshCraft = SetcaDvijPloshad2;
// Ищем координаты монстра, и занимаемся поиском координат клеток в радиусе шагания монстра -----
Pickposition = TipaMonster.transform.position;
mxi = Mathf.CeilToInt(Pickposition.x);
mzi = Mathf.CeilToInt(Pickposition.z);
MonCorZ = mzi; //Z координаты монстра
MonCorX = mxi; //X координаты монстра
MonCorZ = (MonCorZ - (SetkaMonHodZ / 2)); //Z координата точки отсчёта построения сетки ходьбы
MonCorX = (MonCorX - (SetkaMonHodX / 2)); //X координата точки отсчёта построения сетки ходьбы
MonCorX = MonCorX - 1; //X координаты монстра, еденицу отнимаем, чтобы воспользоваться формулой для расчёта X координаты номера ячейки
PloshCraft = SetcaDvijPloshad2;
PloshCraftMassCounter = 0;
PloshMonHodXZ = SetkaMonHodX * SetkaMonHodZ;
Xcount = MonCorX;
if (Xcount > 0)
{
for (ZERO = 0; ZERO < Xcount; Xcount--)
{
SX = SX + SetkaDvijScaleZ2;
}
}
if (Xcount <= 0)
{
for (ZERO = 0; ZERO > Xcount; Xcount++)
{
SX = SX - SetkaDvijScaleZ2;
}
}
UniversalCounter2 = SetkaMonHodX;
UniversalCounter3 = SetkaMonHodZ;
UniversalCounter = 0;
Zcounter = 0;
for (ZERO = 0; ZERO < UniversalCounter3; UniversalCounter3--)
{
for (ZERO = 0; ZERO < UniversalCounter2; UniversalCounter2--)
{
if ((SX + Zcounter + MonCorZ) <= PloshCraft && (SX + Zcounter + MonCorZ) >= 0 - SX - Zcounter - SetkaDvijScaleZ2 && (MonCorZ + UniversalCounter) >= 0 && (MonCorZ + UniversalCounter) <= SetkaDvijScaleZ2)
{
MonHodMass[SX + Zcounter, MonCorZ + UniversalCounter] = 3;
}
UniversalCounter = UniversalCounter + 1;
if (UniversalCounter > (SetkaMonHodX - 1))
{
UniversalCounter = 0;
}
}
Zcounter = Zcounter + SetkaDvijScaleZ2;
UniversalCounter2 = SetkaMonHodX;
}
Zcounter = 0;
SX = 0;
UniversalCounter = 0;
UniversalCounter2 = 0;
UniversalCounter3 = 0;
PloX = 0;
PloZ = 1;
for (PloshCraftFor = 0; PloshCraftFor < PloshCraft; PloshCraft--)
{
MonHodYachMass[PloshCraftMassCounter] = MonHodMass[PloX, PloZ];
PloshCraftMassCounter = PloshCraftMassCounter + 1;
PloZ = PloZ + 1;
if (PloZ > SetkaDvijScaleZ2)
{
PloZ = 1;
PloX = PloX + SetkaDvijScaleZ2;
}
}
//-----------------------------------------------------------------------------------------------
SDVIGX = SetkaDvijScaleX2;
SetkaDvij2 = new Mesh();
//Создаём меш.
//Подключаем меш фильтр.
MeshFilter SetkaDvijFilter2 = GetComponent<MeshFilter>();
//Применяем мешфильтр к мешу.
SetkaDvijFilter2.mesh = SetkaDvij2;
TESTE = 2;
}
}
}
}
}
}
if (SPK == 3 && TESTE == 2)
{
BR = 0;
SDVIG = 0;
SDVIG2 = 1;
SDVIGX2 = 0;
SDVIGFUCK = 0;
//Получаем номера скиллов монстра
FightScene.SkillButton1 = MI.MonsterSkill1;
FightScene.SkillButton2 = MI.MonsterSkill2;
FightScene.SkillButton3 = MI.MonsterSkill3;
FightScene.SkillButton4 = MI.MonsterSkill4;
FightScene.SkillButton5 = MI.MonsterSkill5;
FightScene.SkillButton6 = MI.MonsterSkill6;
//Получаем радиус атаки скиллов монстра
FightScene.SkillRange1 = MI.MonsterSkill1Range;
FightScene.SkillRange2 = MI.MonsterSkill2Range;
FightScene.SkillRange3 = MI.MonsterSkill3Range;
FightScene.SkillRange4 = MI.MonsterSkill4Range;
FightScene.SkillRange5 = MI.MonsterSkill5Range;
FightScene.SkillRange6 = MI.MonsterSkill6Range;
FightScene.SkillLoad = 1; // Статус получения скиллов.
//-----------------------------------------
FightScene.SkillPanelSower = 1;
FightScene.AttacCor = TipaMonster.transform.position;
StatusVideleniya = 1;
//Циклы создания сетки исходя из её размера по оси "z" и оси "x" а так же её площади.
for (ZDvij = 0; ZDvij < SetkaDvijScaleZ2; SetkaDvijScaleZ2--)
{
for (XDvij = 0; XDvij < SetkaDvijScaleX2; SetkaDvijScaleX2--)
{
for (UDvij = 0; UDvij < SetcaDvijPloshad2; SetcaDvijPloshad2--)
{
if (MonHodYachMass[Perebor] == 3 && PloshCraftMass[Perebor] == 0)
{
// Пишем координаты вершин в массив
Vershini1[VK] = new Vector3(SetkaDvijScaleX2 - SDVIG2, SetkaDvijScaleZ2 - SDVIGFUCK, 0);
Vershini1[VK + 1] = new Vector3(SetkaDvijScaleX2 - SDVIG, SetkaDvijScaleZ2 - 1 - SDVIGFUCK, 0);
Vershini1[VK + 2] = new Vector3(SetkaDvijScaleX2 - SDVIG2, SetkaDvijScaleZ2 - 1 - SDVIGFUCK, 0);
Vershini1[VK + 3] = new Vector3(SetkaDvijScaleX2 - SDVIG, SetkaDvijScaleZ2 - SDVIGFUCK, 0);
Vershini1[VK + 4] = new Vector3(SetkaDvijScaleX2 - SDVIG, SetkaDvijScaleZ2 - 1 - SDVIGFUCK, 0);
Vershini1[VK + 5] = new Vector3(SetkaDvijScaleX2 - SDVIG2, SetkaDvijScaleZ2 - SDVIGFUCK, 0);
// Пишем текстурные координаты в массив
TextureCoordinates[VK] = new Vector2(SetkaDvijScaleX2 - SDVIG2, SetkaDvijScaleZ2 - SDVIGFUCK);
TextureCoordinates[VK + 1] = new Vector2(SetkaDvijScaleX2 - SDVIG, SetkaDvijScaleZ2 - 1 - SDVIGFUCK);
TextureCoordinates[VK + 2] = new Vector2(SetkaDvijScaleX2 - SDVIG2, SetkaDvijScaleZ2 - 1 - SDVIGFUCK);
TextureCoordinates[VK + 3] = new Vector2(SetkaDvijScaleX2 - SDVIG, SetkaDvijScaleZ2 - SDVIGFUCK);
TextureCoordinates[VK + 4] = new Vector2(SetkaDvijScaleX2 - SDVIG, SetkaDvijScaleZ2 - 1 - SDVIGFUCK);
TextureCoordinates[VK + 5] = new Vector2(SetkaDvijScaleX2 - SDVIG2, SetkaDvijScaleZ2 - SDVIGFUCK);
// Обнуляем номерные массивы проходимости ячеек
MonHodYachMass[Perebor] = 0;
PloshCraftMass[Perebor] = 0;
SetcaCreate = 1;
}
Perebor = Perebor - 1;
VK = VK + 6;
SDVIG = SDVIG + 1;
SDVIG2 = SDVIG2 + 1;
SDVIGX2 = SDVIGX2 + 1;
if (SDVIGX2 == SDVIGX)
{
SDVIGX2 = 0;
SDVIGFUCK = SDVIGFUCK + 1;
}
if (SDVIG == SDVIGX)
{
SDVIG = 0;
}
if (SDVIG2 == SDVIGX + 1)
{
SDVIG2 = 1;
}
//Создаём массив с трианглами.
Bermudes1[BR] = 0 + BR;
Bermudes1[BR + 1] = 2 + BR;
Bermudes1[BR + 2] = 1 + BR;
Bermudes1[BR + 3] = 3 + BR;
Bermudes1[BR + 4] = 5 + BR;
Bermudes1[BR + 5] = 4 + BR;
BR = BR + 6;
}
}
}
if (TESTE == 2 && SetcaDvijPloshad2 == 0)
{
SetkaDvijScaleX2 = SetkaDvijScaleXconstant;
SetkaDvijScaleZ2 = SetkaDvijScaleZconstant;
//Задаём вершины мешу.
SetkaDvij2.vertices = Vershini1;
//Создаём трианглы меша.
SetkaDvij2.triangles = Bermudes1;
SetkaDvij2.uv = TextureCoordinates;
SetkaDvij2.RecalculateBounds();
SetkaDvij2.RecalculateNormals();
SetkaDvij2.RecalculateTangents();
if (SetcaCreate == 1)
{
MeshCollider MeshColl = SetkaMobile.AddComponent(typeof(MeshCollider)) as MeshCollider;
MeshColl.sharedMesh = SetkaDvij2;
}
SetcaCreate = 0;
TESTE = 1;
Pickposition = TipaMonster.transform.position;
VK = VK - 1;
for (ZERO = 0; ZERO < VK; VK--)
{
Vershini1[VK] = new Vector3(0, 0, 0);
}
BR = BR - 1;
for (ZERO = 0; ZERO < BR; BR--)
{
Bermudes1[BR] = 0;
}
SetcaDvijPloshad2 = SetkaDvijScaleZ2 * SetkaDvijScaleX2;
PloshCraft = SetcaDvijPloshad2 - 1;
for (ZERO = 0; ZERO < PloshCraft; PloshCraft--)
{
MonHodYachMass[PloshCraft] = 5;
}
SetcaDvijPloshad2 = SetkaDvijScaleZ2 * SetkaDvijScaleX2;
PloshCraft = SetcaDvijPloshad2 - 1;
for (ZERO = 0; ZERO < PloshCraft; PloshCraft--)
{
PloshCraftMass[PloshCraft] = 5;
}
MHCleanerX = (SetkaDvijScaleX2 * SetkaDvijScaleZ2) + 1 - 1;
MHCleanerZ = SetkaDvijScaleZ2 + 1 + SetkaMonHodZ - 1;
for (ZERO = 0; ZERO < MHCleanerX; MHCleanerX--)
{
for (ZERO = 0; ZERO < MHCleanerZ; MHCleanerZ--)
{
MonHodMass[MHCleanerX, MHCleanerZ] = 0;
}
}
}
}
if (ProgonScripta == 0)
{
ProgonScripta = ProgonScripta = 1;
}
}
}
}
Скрипт отвечающий за отображение и скрывание нужного куска гуя (не весь):
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SkillPanelSkrivator : MonoBehaviour
{
public float Timer = 0f;
public GameObject SkillPanel;
// Start is called before the first frame update
void Start()
{
SkillPanel.gameObject.SetActive(false); //Скрываем панель скиллов
}
void Update()
{
if (FightScene.SkillPanelSower == 4)
{
Debug.Log("FightScene.SkillPanelSower" + FightScene.SkillPanelSower);
FightScene.SkillPanelSower = 0;
Debug.Log("FightScene.SkillPanelSower" + FightScene.SkillPanelSower);
SkillPanel.gameObject.SetActive(false); //Скрываем панель скиллов
}
if (FightScene.SkillPanelSower == 1)
{
Debug.Log("FightScene.SkillPanelSower" + FightScene.SkillPanelSower);
FightScene.SkillPanelSower = 0;
Debug.Log("FightScene.SkillPanelSower" + FightScene.SkillPanelSower);
SkillPanel.gameObject.SetActive(true); //Отображаем панель скиллов
}
if (FightScene.SkillPanelSower == 3)
{
Debug.Log("FightScene.SkillPanelSower" + FightScene.SkillPanelSower);
FightScene.SkillPanelSower = 0;
Debug.Log("FightScene.SkillPanelSower" + FightScene.SkillPanelSower);
if (UnityEngine.EventSystems.EventSystem.current.IsPointerOverGameObject() == false)
{
SkillPanel.gameObject.SetActive(false); //Скрываем панель скиллов
}
}
}
}
Скрипт с глобальными переменными, в который мы часто обращаемся:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public static class FightScene
{
public static int coins = 100;
public static int SkillPanelSower = 0;
public static int Summoning = 0; // Строим сетку призыва монстра, переменная отвечает за запуск скрипта создания оной
public static int SummSost = 0; // Состояние алгоритма вызова скрипта построения сетки призыва монстра
public static int SummDel = 0; // Состояние алгоритма вызова скрипта построения сетки призыва монстра, конкретно параметр удаления сетки
public static int YachClick = 0; // Номер ячейки на панели шорткатов.
public static int SkillButton1 = 0; // Кнопка скилла 1.
public static int SkillButton2 = 0; // Кнопка скилла 2.
public static int SkillButton3 = 0; // Кнопка скилла 3.
public static int SkillButton4 = 0; // Кнопка скилла 4.
public static int SkillButton5 = 0; // Кнопка скилла 5.
public static int SkillButton6 = 0; // Кнопка скилла 5.
public static int SkillRange1 = 0; // Кнопка скилла 1.
public static int SkillRange2 = 0; // Кнопка скилла 2.
public static int SkillRange3 = 0; // Кнопка скилла 3.
public static int SkillRange4 = 0; // Кнопка скилла 4.
public static int SkillRange5 = 0; // Кнопка скилла 5.
public static int SkillRange6 = 0; // Кнопка скилла 5.
public static int SkillLoad = 0; // Кнопка скилла 5.
public static int SkillCreate = 0; // Строим сетку радиуса действия скила, переменная отвечает за запуск скрипта создания оной
public static int SkillSost = 0; // Состояние алгоритма вызова скрипта построения сетки радиуса действия скила
public static int SkillDel = 0; // Состояние алгоритма вызова скрипта построения сетки радиуса действия скила, конкретно параметр удаления сетки
public static int SkillPanelClick = 0; // Номер ячейки на панели скилов
public static Vector3 AttacCor; //Координаты атакующего
public static Vector3 MishenCor; //Координаты мишени
public static int SkillActive = 0; // Активный скилл, он выбран на панели скиллов.
public static int SkillActiveRange = 0; // Радиус области атаки активным скиллом, нужен для измерения расстояния от атакующего монстра до атакуемого.
public static int MonsterVidelStatus = 0; // Статус выделения монстра, проверяем выделен ли кто.
}
Наверное у опытного программиста от говнокодинга сейчас вытекут глаза,
однако этот код исправно функционирует, и довольно быстро )