Показать сообщение отдельно
Старый 21.09.2020, 17:39   #12
Crystal
Терабайт исходников
 
Аватар для Crystal
 
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений
(для 5,374 пользователей)
Ответ: Вызов гуя, есть проблемы.

Щас покажу панковский метод:

Скрипт отвечающий и за выделение монстра, и за построение\удаление сетки
полигонов меша внутри ассета, с учётом массива проходимости ячеек:

[предупреждаю - есть мусор, оставленный от предыдущих версий, и тестов - на езду не влияет ))]

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; // Статус выделения монстра, проверяем выделен ли кто.
}
Наверное у опытного программиста от говнокодинга сейчас вытекут глаза,
однако этот код исправно функционирует, и довольно быстро )
__________________
Проект "Deathbring World - Rangers" и его финансовая поддержка:
https://boosty.to/deathbringrangers

Я на - TWITCH
Канал на YouTube
(Offline)
 
Ответить с цитированием