forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   2D/GUI (http://forum.boolean.name/forumdisplay.php?f=167)
-   -   Вызов гуя, есть проблемы. (http://forum.boolean.name/showthread.php?t=20843)

Crystal 28.09.2020 05:51

Ответ: Вызов гуя, есть проблемы.
 
Цитата:

Сообщение от pax (Сообщение 317617)
Челендж я принял, но это первый и последний черелндж) Видео с готовым хелсбаром в аттаче. Управляется тем же скриптом, что я приводил выше. Вероятнее всего кодом данная штука будет работать чуть быстрее, но не уверен, но настройка цвета кодом конечно удобнее. Можно заморочиться и написать скрипт, применяющий к спрайту цвет на основе двух параметров и анимировать эти два параметра вместо цвета и прозрачности, тогда можно будет задавать цвет снаружи. А сейчас цвет баров зашит в анимациях.

В результате получилось 4 анимации (анимация движения линии вверх-вниз, анимация прозрачности, анимация для перемещения квадратиков и собственно анимация состояния хэлсбара). Анимация прозрачности используется как на линиях, так и на квадратиках. Пришлось для каждой линии сделать копию контроллера анимации и настроить немного по разному скорости воспроизведения анимаций, чтобы получилось так же как у тебя. Тоже самое сделал для квадратиков. Анимация состояния хэлсбара управляет цветом линий и квадратиков (без прозрачности), а так же их масштабом. Плюс она двигает спрайты "скобок".

Моё почтение! Довольно близко к оригиналу, потратить на это ещё
столько же времени, и думаю будет один в один. Челлендж выполнен
быстрее, чем я расчитывал! Лично мне ты всё доказал с анимациями.
Только я думал анимаций меньше будет использоваться )
Немного шлифануть, чуть докодить, и это сэкономило бы
мне много строк кода.

А теперь внимание, барабанная дробь, и на экране
появляются магические числа без комментариев:


Код:

public class KrestAnimation : MonoBehaviour
{
    public Transform Krest;
    public Transform RKrest;
    public Transform LKrest;

    public Transform HPLine1;
    public Transform HPLine2;
    public Transform HPLine3;
    public Transform HPLine4;
    public Transform HPLine5;
    public Transform Begunok1;
    public Transform Begunok2;
    public Transform B2ML;
    public Transform B2MR;
    public Transform B1ML;
    public Transform B1MR;

    public Vector3 V100HPLine1 = new Vector3(2f, 0.03f, 1f);
    public Vector3 V100HPLine2 = new Vector3(2f, 0.01f, 1f);
    public Vector3 V100HPLine3 = new Vector3(2f, 0.05f, 1f);
    public Vector3 V100HPLine4 = new Vector3(2f, 0.005f, 1f);
    public Vector3 V100HPLine5 = new Vector3(2f, 0.02f, 1f);

    public Color Ucolor;

    public float Timer = 0.1f;

    private int L1Sost = 0;
    private float L1Stady = 0;
    private float L1Dist;

    private int L2Sost = 0;
    private float L2Stady = 0;
    private float L2Dist;

    private int L3Sost = 0;
    private float L3Stady = 0;
    private float L3Dist;

    private int L4Sost = 0;
    private float L4Stady = 0;
    private float L4Dist;

    private int L5Sost = 0;
    private float L5Stady = 0;
    private float L5Dist;

    public int B1Sost = 0;
    public float B1Stady = 0f;
    public int B2Sost = 0;
    public float B2Stady = 0f;


    public float MAXHP = 1000f;
    public float HP = 1000f;
    public float HPlast = 1000f;
    public float HPProcent = 0f;

    public int KrestAktivator = 0;

    // Start is called before the first frame update
    void Start()
    {
       
    }

    // Update is called once per frame
    void Update()
    {
        Timer = Timer - 0.1f * Time.time;

        if (Timer <= 0f)
        {
                // Управление размерами и цветом HPLine
                if (HP != HPlast)
            {

                if (HP < 1f && KrestAktivator == 0)
                {
                    RKrest.gameObject.SetActive(false);
                    LKrest.gameObject.SetActive(false);
                    Krest.gameObject.SetActive(true);

                    KrestAktivator = 1;
                }

                if (HP > 0f && KrestAktivator == 1)
                {
                    Krest.gameObject.SetActive(false);
                    RKrest.gameObject.SetActive(true);
                    LKrest.gameObject.SetActive(true);


                    KrestAktivator = 0;
                }


                if (HP < HPlast || HP > HPlast)
                {
                    HPProcent = HP * 100f / MAXHP;
                    HPProcent = HPProcent / 100f;
                    HPLine1.transform.localScale = new Vector3(2f * HPProcent, 0.03f, 1f);
                    HPLine2.transform.localScale = new Vector3(2f * HPProcent, 0.01f, 1f);
                    HPLine3.transform.localScale = new Vector3(2f * HPProcent, 0.05f, 1f);
                    HPLine4.transform.localScale = new Vector3(2f * HPProcent, 0.005f, 1f);
                    HPLine5.transform.localScale = new Vector3(2f * HPProcent, 0.02f, 1f);

                    RKrest.transform.localPosition = new Vector3(-1f * HPProcent, 0f, 0f);
                    LKrest.transform.localPosition = new Vector3(1f * HPProcent, 0f, 0f);


                    if (((HP * 100f) / MAXHP > 79f) && ((HP * 100f) / MAXHP) < 101f)
                    {
                        Ucolor = (HPLine4.GetComponent<Renderer>().material.color);
                        Ucolor.r = 1f;
                        Ucolor.g = 1f;
                        Ucolor.b = 1f;
                        (HPLine4.GetComponent<Renderer>().material.color) = Ucolor;

                        HPProcent = 20f - (100f - ((HP * 100f) / MAXHP));
                        Debug.Log("Процент Линии 4: " + HPProcent);
                        Ucolor = (HPLine4.GetComponent<Renderer>().material.color);
                        Ucolor.r = 1f;
                        Ucolor.g = (HPProcent * 0.05f);
                        Ucolor.b = (HPProcent * 0.05f);
                        (HPLine4.GetComponent<Renderer>().material.color) = Ucolor;
                    }
                    if (((HP * 100f) / MAXHP) < 80f)
                    {
                        Ucolor = (HPLine4.GetComponent<Renderer>().material.color);
                        Ucolor.r = 1f;
                        Ucolor.g = (0f);
                        Ucolor.b = (0f);
                        (HPLine4.GetComponent<Renderer>().material.color) = Ucolor;
                    }



                    if (((HP * 100f) / MAXHP > 59f) && ((HP * 100f) / MAXHP) < 80f)
                    {
                        Ucolor = (HPLine2.GetComponent<Renderer>().material.color);
                        Ucolor.r = 1f;
                        Ucolor.g = 1f;
                        Ucolor.b = 1f;
                        (HPLine2.GetComponent<Renderer>().material.color) = Ucolor;

                        HPProcent = 20f - (80f - ((HP * 100f) / MAXHP));

                        Debug.Log("Процент Линии 2: " + HPProcent);
                        Ucolor = HPLine2.GetComponent<Renderer>().material.color;
                        Ucolor.r = 1f;
                        Ucolor.g = (HPProcent * 0.05f);
                        Ucolor.b = (HPProcent * 0.05f);
                        HPLine2.GetComponent<Renderer>().material.color = Ucolor;
                    }

                    if (((HP * 100f) / MAXHP) < 60f)
                    {
                        Ucolor = (HPLine2.GetComponent<Renderer>().material.color);
                        Ucolor.r = 1f;
                        Ucolor.g = (0f);
                        Ucolor.b = (0f);
                        (HPLine2.GetComponent<Renderer>().material.color) = Ucolor;
                    }
                    if (((HP * 100f) / MAXHP) > 80f)
                    {
                        Ucolor = (HPLine2.GetComponent<Renderer>().material.color);
                        Ucolor.r = 1f;
                        Ucolor.g = 1f;
                        Ucolor.b = 1f;
                        (HPLine2.GetComponent<Renderer>().material.color) = Ucolor;
                    }





                    if (((HP * 100f) / MAXHP > 39f) && ((HP * 100f) / MAXHP) < 60f)
                    {
                        Ucolor = (HPLine5.GetComponent<Renderer>().material.color);
                        Ucolor.r = 1f;
                        Ucolor.g = 1f;
                        Ucolor.b = 1f;
                        (HPLine5.GetComponent<Renderer>().material.color) = Ucolor;

                        HPProcent = 20f - (60f - ((HP * 100f) / MAXHP));

                        Ucolor = (HPLine5.GetComponent<Renderer>().material.color);
                        Ucolor.r = 1f;
                        Ucolor.g = (HPProcent * 0.05f);
                        Ucolor.b = (HPProcent * 0.05f);
                        (HPLine5.GetComponent<Renderer>().material.color) = Ucolor;
                    }
                    if (((HP * 100f) / MAXHP) < 40f)
                    {
                        Ucolor = (HPLine5.GetComponent<Renderer>().material.color);
                        Ucolor.r = 1f;
                        Ucolor.g = (0f);
                        Ucolor.b = (0f);
                        (HPLine5.GetComponent<Renderer>().material.color) = Ucolor;
                    }
                    if (((HP * 100f) / MAXHP) > 60f)
                    {
                        Ucolor = (HPLine5.GetComponent<Renderer>().material.color);
                        Ucolor.r = 1f;
                        Ucolor.g = 1f;
                        Ucolor.b = 1f;
                        (HPLine5.GetComponent<Renderer>().material.color) = Ucolor;
                    }


                    if (((HP * 100f) / MAXHP > 19f) && ((HP * 100f) / MAXHP) < 40f)
                    {
                        Ucolor = (HPLine1.GetComponent<Renderer>().material.color);
                        Ucolor.r = 1f;
                        Ucolor.g = 1f;
                        Ucolor.b = 1f;
                        (HPLine1.GetComponent<Renderer>().material.color) = Ucolor;

                        HPProcent = 20f - (40f - ((HP * 100f) / MAXHP));

                        Ucolor = (HPLine1.GetComponent<Renderer>().material.color);
                        Ucolor.r = 1f;
                        Ucolor.g = (HPProcent * 0.05f);
                        Ucolor.b = (HPProcent * 0.05f);
                        (HPLine1.GetComponent<Renderer>().material.color) = Ucolor;
                    }
                    if (((HP * 100f) / MAXHP) < 20f)
                    {
                        Ucolor = (HPLine1.GetComponent<Renderer>().material.color);
                        Ucolor.r = 1f;
                        Ucolor.g = (0f);
                        Ucolor.b = (0f);
                        (HPLine1.GetComponent<Renderer>().material.color) = Ucolor;
                    }
                    if (((HP * 100f) / MAXHP) > 40f)
                    {
                        Ucolor = (HPLine1.GetComponent<Renderer>().material.color);
                        Ucolor.r = 1f;
                        Ucolor.g = 1f;
                        Ucolor.b = 1f;
                        (HPLine1.GetComponent<Renderer>().material.color) = Ucolor;
                    }





                    if (((HP * 100f) / MAXHP >= 0f) && ((HP * 100f) / MAXHP) < 20f)
                    {
                        Ucolor = (HPLine3.GetComponent<Renderer>().material.color);
                        Ucolor.r = 1f;
                        Ucolor.g = 1f;
                        Ucolor.b = 1f;
                        (HPLine3.GetComponent<Renderer>().material.color) = Ucolor;

                        HPProcent = 20f - (20f - ((HP * 100f) / MAXHP)); ;

                        Ucolor = (HPLine3.GetComponent<Renderer>().material.color);
                        Ucolor.r = 1f;
                        Ucolor.g = (HPProcent * 0.05f);
                        Ucolor.b = (HPProcent * 0.05f);
                        (HPLine3.GetComponent<Renderer>().material.color) = Ucolor;
                    }
                    if (((HP * 100f) / MAXHP) == 0f)
                    {
                        Ucolor = (HPLine3.GetComponent<Renderer>().material.color);
                        Ucolor.r = 1f;
                        Ucolor.g = (0f);
                        Ucolor.b = (0f);
                        (HPLine3.GetComponent<Renderer>().material.color) = Ucolor;
                    }
                    if (((HP * 100f) / MAXHP) > 20f)
                    {
                        Ucolor = (HPLine3.GetComponent<Renderer>().material.color);
                        Ucolor.r = 1f;
                        Ucolor.g = 1f;
                        Ucolor.b = 1f;
                        (HPLine3.GetComponent<Renderer>().material.color) = Ucolor;
                    }




                    HPProcent = 0f;
                    HPlast = HP;
                }


                if (HP >= MAXHP)
                {
                    HPLine1.transform.localScale = V100HPLine1;
                    HPLine2.transform.localScale = V100HPLine2;
                    HPLine3.transform.localScale = V100HPLine3;
                    HPLine4.transform.localScale = V100HPLine4;
                    HPLine5.transform.localScale = V100HPLine5;

                    RKrest.transform.localPosition = new Vector3(-1f, 0f, 0f);
                    LKrest.transform.localPosition = new Vector3(1f, 0f, 0f);

                    HP = MAXHP;
                    HPlast = MAXHP;
                }

                if (HP < 0)
                {
                    HPLine1.transform.localScale = new Vector3(0f * HPProcent, 0.03f, 1f);
                    HPLine2.transform.localScale = new Vector3(0f * HPProcent, 0.01f, 1f);
                    HPLine3.transform.localScale = new Vector3(0f * HPProcent, 0.05f, 1f);
                    HPLine4.transform.localScale = new Vector3(0f * HPProcent, 0.005f, 1f);
                    HPLine5.transform.localScale = new Vector3(0f * HPProcent, 0.02f, 1f);

                    RKrest.transform.localPosition = new Vector3(0f, 0f, 0f);
                    LKrest.transform.localPosition = new Vector3(0f, 0f, 0f);

                    HP = 0;
                    HPlast = 0;
                }



            }

            // Конец управления размерами и цветом HPLine.

            // Управление HPLine1


            Ucolor = (HPLine1.GetComponent<Renderer>().material.color);

            if (L1Sost == 1)
            {
                if (Ucolor.a > 0.99f)
                {
                    L1Sost = 0;
                    Ucolor.a = 1f;
                    (HPLine1.GetComponent<Renderer>().material.color) = Ucolor;
                }
            }

            if (L1Sost == 0)
            {
                if (Ucolor.a > 0f)
                {
                    Ucolor.a = Ucolor.a - 0.005f;
                    (HPLine1.GetComponent<Renderer>().material.color) = Ucolor;
                }
            }

            if (L1Sost == 1)
            {

                if (Ucolor.a < 10f)
                {
                    Ucolor.a = Ucolor.a + 0.005f;
                    (HPLine1.GetComponent<Renderer>().material.color) = Ucolor;

                }
            }

            if (Ucolor.a <= 0f && L1Sost == 0)
            {
                L1Sost = 1;
            }

            L1Dist = Vector3.Distance(HPLine1.transform.position, Krest.transform.position);

            if (L1Dist > 0f && L1Stady == 2)
            {
                HPLine1.transform.Translate(Vector3.down * 0.001f);

                L1Dist = Vector3.Distance(HPLine1.transform.position, Krest.transform.position);

                if (L1Dist >= 0.18f)
                {
                    L1Stady = 1;
                }
            }

            if (L1Dist > 0f && L1Stady == 1)
            {
                HPLine1.transform.Translate(Vector3.up * 0.001f);

                L1Dist = Vector3.Distance(HPLine1.transform.position, Krest.transform.position);

                if (L1Dist >= 0.18f)
                {
                    L1Stady = 2;
                }
            }


            if (L1Dist < 0.18f && L1Stady == 0)
            {
                HPLine1.transform.Translate(Vector3.down * 0.001f);

                L1Dist = Vector3.Distance(HPLine1.transform.position, Krest.transform.position);

                if (L1Dist >= 0.18f)
                {
                    L1Stady = 1;
                }
            }

            // Конец управления HPLine1.

            // Управление HPLine2

            Ucolor = (HPLine2.GetComponent<Renderer>().material.color);

            if (L2Sost == 1)
            {
                if (Ucolor.a > 0.99f)
                {
                    L2Sost = 0;
                    Ucolor.a = 1f;
                    (HPLine2.GetComponent<Renderer>().material.color) = Ucolor;
                }
            }

            if (L2Sost == 0)
            {
                if (Ucolor.a > 0f)
                {
                    Ucolor.a = Ucolor.a - 0.01f;
                    (HPLine2.GetComponent<Renderer>().material.color) = Ucolor;
                }
            }

            if (L2Sost == 1)
            {

                if (Ucolor.a < 10f)
                {
                    Ucolor.a = Ucolor.a + 0.01f;
                    (HPLine2.GetComponent<Renderer>().material.color) = Ucolor;

                }
            }

            if (Ucolor.a <= 0f && L2Sost == 0)
            {
                L2Sost = 1;
            }

            L2Dist = Vector3.Distance(HPLine2.transform.position, Krest.transform.position);

            if (L2Dist > 0f && L2Stady == 2)
            {
                HPLine2.transform.Translate(Vector3.down * 0.002f);

                L2Dist = Vector3.Distance(HPLine2.transform.position, Krest.transform.position);

                if (L2Dist >= 0.18f)
                {
                    L2Stady = 1;
                }
            }

            if (L2Dist > 0f && L2Stady == 1)
            {
                HPLine2.transform.Translate(Vector3.up * 0.002f);

                L2Dist = Vector3.Distance(HPLine2.transform.position, Krest.transform.position);

                if (L2Dist >= 0.18f)
                {
                    L2Stady = 2;
                }
            }


            if (L2Dist < 0.18f && L2Stady == 0)
            {
                HPLine2.transform.Translate(Vector3.down * 0.002f);

                L2Dist = Vector3.Distance(HPLine2.transform.position, Krest.transform.position);

                if (L2Dist >= 0.18f)
                {
                    L2Stady = 1;
                }
            }

            // Конец управления HPLine2.

            // Управление HPLine3

            Ucolor = (HPLine3.GetComponent<Renderer>().material.color);

            if (L3Sost == 1)
            {
                if (Ucolor.a > 0.99f)
                {
                    L3Sost = 0;
                    Ucolor.a = 1f;
                    (HPLine3.GetComponent<Renderer>().material.color) = Ucolor;
                }
            }

            if (L3Sost == 0)
            {
                if (Ucolor.a > 0f)
                {
                    Ucolor.a = Ucolor.a - 0.01f;
                    (HPLine3.GetComponent<Renderer>().material.color) = Ucolor;
                }
            }

            if (L3Sost == 1)
            {

                if (Ucolor.a < 10f)
                {
                    Ucolor.a = Ucolor.a + 0.01f;
                    (HPLine3.GetComponent<Renderer>().material.color) = Ucolor;

                }
            }

            if (Ucolor.a <= 0f && L3Sost == 0)
            {
                L3Sost = 1;
            }

            L3Dist = Vector3.Distance(HPLine3.transform.position, Krest.transform.position);

            if (L3Dist > 0f && L3Stady == 2)
            {
                HPLine3.transform.Translate(Vector3.down * 0.0005f);

                L3Dist = Vector3.Distance(HPLine3.transform.position, Krest.transform.position);

                if (L3Dist >= 0.17f)
                {
                    L3Stady = 1;
                }
            }

            if (L3Dist > 0f && L3Stady == 1)
            {
                HPLine3.transform.Translate(Vector3.up * 0.0005f);

                L3Dist = Vector3.Distance(HPLine3.transform.position, Krest.transform.position);

                if (L3Dist >= 0.17f)
                {
                    L3Stady = 2;
                }
            }


            if (L3Dist < 0.17f && L3Stady == 0)
            {
                HPLine3.transform.Translate(Vector3.down * 0.0005f);

                L3Dist = Vector3.Distance(HPLine3.transform.position, Krest.transform.position);

                if (L3Dist >= 0.17f)
                {
                    L3Stady = 1;
                }
            }

            // Конец управления HPLine3.

            // Управление HPLine4

            Ucolor = (HPLine4.GetComponent<Renderer>().material.color);

            if (L4Sost == 1)
            {
                if (Ucolor.a > 0.99f)
                {
                    L4Sost = 0;
                    Ucolor.a = 1f;
                    (HPLine4.GetComponent<Renderer>().material.color) = Ucolor;
                }
            }

            if (L4Sost == 0)
            {
                if (Ucolor.a > 0f)
                {
                    Ucolor.a = Ucolor.a - 0.025f;
                    (HPLine4.GetComponent<Renderer>().material.color) = Ucolor;
                }
            }

            if (L4Sost == 1)
            {

                if (Ucolor.a < 10f)
                {
                    Ucolor.a = Ucolor.a + 0.025f;
                    (HPLine4.GetComponent<Renderer>().material.color) = Ucolor;

                }
            }

            if (Ucolor.a <= 0f && L4Sost == 0)
            {
                L4Sost = 1;
            }

            L4Dist = Vector3.Distance(HPLine4.transform.position, Krest.transform.position);

            if (L4Dist > 0f && L4Stady == 2)
            {
                HPLine4.transform.Translate(Vector3.down * 0.003f);

                L4Dist = Vector3.Distance(HPLine4.transform.position, Krest.transform.position);

                if (L4Dist >= 0.18f)
                {
                    L4Stady = 1;
                }
            }

            if (L4Dist > 0f && L4Stady == 1)
            {
                HPLine4.transform.Translate(Vector3.up * 0.003f);

                L4Dist = Vector3.Distance(HPLine4.transform.position, Krest.transform.position);

                if (L4Dist >= 0.18f)
                {
                    L4Stady = 2;
                }
            }


            if (L4Dist < 0.18f && L4Stady == 0)
            {
                HPLine4.transform.Translate(Vector3.down * 0.003f);

                L4Dist = Vector3.Distance(HPLine4.transform.position, Krest.transform.position);

                if (L4Dist >= 0.18f)
                {
                    L4Stady = 1;
                }
            }

            // Конец управления HPLine4.

            // Управление HPLine5

            Ucolor = (HPLine5.GetComponent<Renderer>().material.color);

            if (L5Sost == 1)
            {
                if (Ucolor.a > 0.99f)
                {
                    L5Sost = 0;
                    Ucolor.a = 1f;
                    (HPLine5.GetComponent<Renderer>().material.color) = Ucolor;
                }
            }

            if (L5Sost == 0)
            {
                if (Ucolor.a > 0f)
                {
                    Ucolor.a = Ucolor.a - 0.002f;
                    (HPLine5.GetComponent<Renderer>().material.color) = Ucolor;
                }
            }

            if (L5Sost == 1)
            {

                if (Ucolor.a < 10f)
                {
                    Ucolor.a = Ucolor.a + 0.002f;
                    (HPLine5.GetComponent<Renderer>().material.color) = Ucolor;

                }
            }

            if (Ucolor.a <= 0f && L5Sost == 0)
            {
                L5Sost = 1;
            }

            L5Dist = Vector3.Distance(HPLine5.transform.position, Krest.transform.position);

            if (L5Dist > 0f && L5Stady == 2)
            {
                HPLine5.transform.Translate(Vector3.down * 0.003f);

                L5Dist = Vector3.Distance(HPLine5.transform.position, Krest.transform.position);

                if (L5Dist >= 0.18f)
                {
                    L5Stady = 1;
                }
            }

            if (L5Dist > 0f && L5Stady == 1)
            {
                HPLine5.transform.Translate(Vector3.up * 0.003f);

                L5Dist = Vector3.Distance(HPLine5.transform.position, Krest.transform.position);

                if (L5Dist >= 0.18f)
                {
                    L5Stady = 2;
                }
            }


            if (L5Dist < 0.18f && L5Stady == 0)
            {
                HPLine5.transform.Translate(Vector3.down * 0.003f);

                L5Dist = Vector3.Distance(HPLine5.transform.position, Krest.transform.position);

                if (L5Dist >= 0.18f)
                {
                    L5Stady = 1;
                }
            }

            // Конец управления HPLine5.

            // Управление Begunok1.

            if (B1Stady == 2)
            {
                if (Vector3.Distance(Begunok1.transform.position, B1ML.transform.position) > 0f && Vector3.Distance(Begunok1.transform.position, B1MR.transform.position) < ((((0.495f) * ((HP * 100f) / MAXHP)) / 100f) * 4f))
                {
                    Begunok1.transform.Translate(Vector3.right * (((0.005f) * ((HP * 100f) / MAXHP)) / 100f));

                }
                Ucolor = (Begunok1.GetComponent<Renderer>().material.color);

                if (Ucolor.a > 0f)
                {
                    Ucolor.a = Ucolor.a - 0.003f;
                    (Begunok1.GetComponent<Renderer>().material.color) = Ucolor;
                }

                if (Vector3.Distance(Begunok1.transform.position, B1ML.transform.position) <= 0.005f && B1Stady == 2)
                {
                   
                    B1Stady = 1;
                    Ucolor = (Begunok1.GetComponent<Renderer>().material.color);
                    Ucolor.a = 0f;
                    (Begunok1.GetComponent<Renderer>().material.color) = Ucolor;
                }
            }


            if (B1Stady == 1)
            {
               
                if (Vector3.Distance(Begunok1.transform.position, B1MR.transform.position) > 0f)
                {
                    Begunok1.transform.Translate(Vector3.left * (((0.005f) * ((HP * 100f) / MAXHP)) / 100f));

                }

                if (Vector3.Distance(Begunok1.transform.position, B1MR.transform.position) <= 0.005f && B1Stady == 1)
                {
                    B1Stady = 2;
                    Ucolor = (Begunok1.GetComponent<Renderer>().material.color);
                    Ucolor.a = 1f;
                    (Begunok1.GetComponent<Renderer>().material.color) = Ucolor;
                }
            }

            if (B1Stady == 0)
            {
                if (Vector3.Distance(Begunok1.transform.position, B1ML.transform.position) > 0f && Vector3.Distance(Begunok1.transform.position, B1MR.transform.position) < ((((0.495f) * ((HP * 100f) / MAXHP)) / 100f) * 4f))
                {
                 
                    Begunok1.transform.Translate(Vector3.right * (((0.005f) * ((HP * 100f) / MAXHP)) / 100f));

                }
                Ucolor = (Begunok1.GetComponent<Renderer>().material.color);

                if (Ucolor.a > 0f)
                {
                    Ucolor.a = Ucolor.a - 0.003f;
                    (Begunok1.GetComponent<Renderer>().material.color) = Ucolor;
                }

                if (Vector3.Distance(Begunok1.transform.position, B1ML.transform.position) <= 0.005f && B1Stady == 0)
                {
                    B1Stady = 1;
                    Ucolor = (Begunok1.GetComponent<Renderer>().material.color);
                    Ucolor.a = 0f;
                    (Begunok1.GetComponent<Renderer>().material.color) = Ucolor;
                }
            }

            // Конец управления Begunok1.

            // Управление Begunok2.

            if (B2Stady == 2)
            {
               
              if (Vector3.Distance(Begunok2.transform.position, B2MR.transform.position) > 0f && Vector3.Distance(Begunok2.transform.position, B2ML.transform.position) < ((((0.4900002f) * ((HP * 100f) / MAXHP)) / 100f) * 4f)) 
                {
                    Begunok2.transform.Translate(Vector3.left * (((0.005f) * ((HP * 100f) / MAXHP)) / 100f));

                }
                Ucolor = (Begunok2.GetComponent<Renderer>().material.color);

                if (Ucolor.a > 0f)
                {
                    Ucolor.a = Ucolor.a - 0.003f;
                    (Begunok2.GetComponent<Renderer>().material.color) = Ucolor;
                }

                if (Vector3.Distance(Begunok2.transform.position, B2MR.transform.position) <= 0.005f && B2Stady == 2)
                {
                    B2Stady = 1;
                    Ucolor = (Begunok2.GetComponent<Renderer>().material.color);
                    Ucolor.a = 0f;
                    (Begunok2.GetComponent<Renderer>().material.color) = Ucolor;
                }
            }


            if (B2Stady == 1)
            {
                if (Vector3.Distance(Begunok2.transform.position, B2ML.transform.position) > 0f)
                {
                    Begunok2.transform.Translate(Vector3.right * (((0.005f) * ((HP * 100f) / MAXHP)) / 100f));

                }

                if (Vector3.Distance(Begunok2.transform.position, B2ML.transform.position) <= 0.005f && B2Stady == 1)
                {
                    B2Stady = 2;
                    Ucolor = (Begunok2.GetComponent<Renderer>().material.color);
                    Ucolor.a = 1f;
                    (Begunok2.GetComponent<Renderer>().material.color) = Ucolor;
                }
            }

            if (B2Stady == 0)
            {
                if (Vector3.Distance(Begunok2.transform.position, B2MR.transform.position) > 0f && Vector3.Distance(Begunok2.transform.position, B2ML.transform.position) < ((((0.4900002f) * ((HP * 100f) / MAXHP)) / 100f) * 4f))
                {
                    Begunok2.transform.Translate(Vector3.left * (((0.005f) * ((HP * 100f) / MAXHP)) / 100f));

                }
                Ucolor = (Begunok2.GetComponent<Renderer>().material.color);

                if (Ucolor.a > 0f)
                {
                    Ucolor.a = Ucolor.a - 0.003f;
                    (Begunok2.GetComponent<Renderer>().material.color) = Ucolor;
                }

                if (Vector3.Distance(Begunok2.transform.position, B2MR.transform.position) <= 0.005f && B2Stady == 0)
                {
                    B2Stady = 1;
                    Ucolor = (Begunok2.GetComponent<Renderer>().material.color);
                    Ucolor.a = 0f;
                    (Begunok2.GetComponent<Renderer>().material.color) = Ucolor;
                }
            }

            // Конец управления Begunok2.

            Timer = 0.1f;
        }

    }
}



Много самокопипасты внутри кода, т.к. линиями управляет одинаковый
код, но с другими значениями. Оптимизировать размер можно,
не стал заморачиваться, смысла не имеет. На счёт скорости работы
кодом, не уверен, что она выше, т.к. я например постоянно мерю расстояния.
Первый вариант у меня был на таймерах, но я пришёл к выводу, что таймеры здесь неуместны.
Ну и вместо констант магические числа, для меня они те же константы )

Цитата:

Сообщение от ABTOMAT (Сообщение 317618)
Но зачем и чтобы что, если кодом проще?

Его вариант в реализации в разы быстрее, и кода в разы меньше.
Отличный вариант для дизайнера ) Ну, когда игры чисто на нодах пишут во всяких UE )
В общем данный способ имеет место быть, и нужно это как-то на ус мотать,
реально вижу экономит время.

Crystal 28.09.2020 06:35

Ответ: Вызов гуя, есть проблемы.
 
Добавил. Я сейчас подумал, и уже не уверен, что на анимациях разрабокта быстрее.
Я всё-таки больше возился с расчётом цвета, никто не написал в этих
ваших хэлпах, что цвет задаётся от 0 до 1, а не от 0 до 255 как
в интерфейсе юньки, и другие подводные камни, об которые я споткнулся.
Управление движением же было накодено моментально.

Тут надо как-то в общем скорость работы сравнивать,
чтобы понять, зачем и чтобы что )

pax 28.09.2020 07:40

Ответ: Вызов гуя, есть проблемы.
 
Цитата:

Сообщение от Crystal (Сообщение 317620)
Я всё-таки больше возился с расчётом цвета, никто не написал в этих
ваших хэлпах, что цвет задаётся от 0 до 1, а не от 0 до 255 как
в интерфейсе юньки

Есть два класса Color и Color32, компоненты второго как раз измеряются в диапазоне 0..255

Цитата:

Сообщение от Crystal (Сообщение 317620)
Тут надо как-то в общем скорость работы сравнивать,
чтобы понять, зачем и чтобы что )

Т.к. я с анимациями работаю редко, я потратил на реализацию где-то час. С учетом того, что пришлось подумать как сделать анимацию так, чтобы она не была похожа на зацикленную. Отсюда много контроллеров для линий. Можно было бы сделать одну анимацию для всех линий, но длинную. Мне лень было заморачиваться. Но одну вещь я еще сделаю - напишу данный хэлсбар скриптом, чтобы показать тебе плюсы массивов и ООП.

Crystal 28.09.2020 10:17

Ответ: Вызов гуя, есть проблемы.
 
Цитата:

Сообщение от pax (Сообщение 317621)
Есть два класса Color и Color32, компоненты второго как раз измеряются в диапазоне 0..255


Т.к. я с анимациями работаю редко, я потратил на реализацию где-то час. С учетом того, что пришлось подумать как сделать анимацию так, чтобы она не была похожа на зацикленную. Отсюда много контроллеров для линий. Можно было бы сделать одну анимацию для всех линий, но длинную. Мне лень было заморачиваться. Но одну вещь я еще сделаю - напишу данный хэлсбар скриптом, чтобы показать тебе плюсы массивов и ООП.

Не стоит пакс, я с массивами работаю где мне это удобно,
массив не является для меня чем-то новым и непонятным )
Просто я использую массивы только для хранения огромных объёмов информации.
В текущем проекте например в массивах хранятся карты проходимости по клеткам уровня,
хранятся координаты ячеек при конструировании мешей.
Когда дойду до загрузки-сохранения игрового процесса, тоже всё будет в массивах.

pax 28.09.2020 10:30

Ответ: Вызов гуя, есть проблемы.
 
Вложений: 2
Цитата:

Сообщение от Crystal (Сообщение 317622)
Не стоит пакс, я с массивами работаю где мне это удобно,
массив не является для меня чем-то новым и непонятным )

Тем не менее я уже сделал. В аттаче видео результата и проект (Unity 2019.4.10). Собственно код получился вот такой:

PHP код:

using UnityEngine;

public class 
HealthBarAnimated MonoBehaviour
{
    public 
int health;
    public 
int maxHealth;

    public 
Color32 normalColor;
    public 
Color32 dangerColor;

    [
System.Serializable]
    public class 
AnimatedElement
    
{
        public 
SpriteRenderer sprite// анимируемый спрайт
        
public Vector3 startPosition// начальная позиция анимации
        
public Vector3 endPosition;   // конечная позиция анимации
        
public float positionAnimationSpeed 1;  // скорость анимации позиции
        
public bool animatePositionAsHealthPercent false// анимировать позицию на основе процента жизней
        
private float positionAnimationTime// текущее время анимации позиции

        
public bool animateColor true// анимировать цвет
        
public AnimationCurve alphaAnimationCurve// кривая анимации альфы (можно конечно было использовать Mathf.SmoothStep, но решил показать еще один способ анимации)
        
public float alphaAnimationSpeed 1// скорость анимации альфы
        
private float alphaAnimationTime// время анимации альфы

        
public bool animateHealthPercentScale false// анимировать скейл на основе процента жизней
        
public AnimationCurve healthPercentScaleAnimationCurve// кривая интерполяции анимации масштаба
        
public Vector3 healthPercentStartScale// начальный масштаб
        
public Vector3 healthPercentEndScale// конечный масштаб

        
public float healthColorTransitionStart// начало зоны перехода из нормального цвета в цвет опасности
        
public float healthColorTransitionEnd// конец зоны перехода из нормального цвета в цвет опасности



        
public void Init()
        {
            
// рандомизация начальных позиций анимаций
            
positionAnimationTime Random.value;
            
alphaAnimationTime Random.value;
        }

        
// обновление состояния спрайта
        
public void Update(float healthPercentColor32 normalColorColor32 dangerColorfloat deltaTime)
        {
            if (
animatePositionAsHealthPercent)
            {
                
sprite.transform.localPosition Vector3.Lerp(startPositionendPositionhealthPercent);
            }
            else
            {
                
positionAnimationTime += deltaTime positionAnimationSpeed;
                
sprite.transform.localPosition Vector3.Lerp(startPositionendPositionMathf.PingPong(positionAnimationTime1));
            }

            if (
animateHealthPercentScale)
            {
                
sprite.transform.localScale Vector3.Lerp(healthPercentStartScalehealthPercentEndScalehealthPercent);
            }


            if (
animateColor)
            {
                var 
healthPercentClamped Mathf.Clamp(healthPercenthealthColorTransitionStarthealthColorTransitionEnd);
                var 
healthColorT = (healthPercentClamped healthColorTransitionStart) / (healthColorTransitionEnd healthColorTransitionStart);
                var 
color Color.Lerp(dangerColornormalColorhealthColorT);
                
alphaAnimationTime += deltaTime alphaAnimationSpeed;
                
color.alphaAnimationCurve.Evaluate(Mathf.PingPong(alphaAnimationTime1));
                
sprite.color color;
            }
        }
    }

    
// массив анимируемых объектов
    
public AnimatedElement[] animatedElements;

    
void Start()
    {
        
// инициализация элементов
        
for (int i 0animatedElements.Lengthi++)
        {
            
animatedElements[i].Init();
        }
    }

    
void Update()
    {
        if (
health 0health 0;
        if (
health maxHealthhealth maxHealth;

        var 
healthPercent health / (float)maxHealth;


        
// обновление анимации элементов
        
for (int i 0animatedElements.Lengthi++)
        {
            
animatedElements[i].Update(healthPercentnormalColordangerColorTime.deltaTime);
        }
    }


По времени заняло пол часа кода, пол часа настройки.

Crystal 28.09.2020 12:17

Ответ: Вызов гуя, есть проблемы.
 
Цитата:

Сообщение от pax (Сообщение 317623)
Тем не менее я уже сделал. В аттаче видео результата и проект (Unity 2019.4.10). Собственно код получился вот такой:

Твою бы активность да в собственный проект )
Это уже оффтоп, но я всегда допускаю оффтопство в своих темах.
Даже хелсбар оффтоп на самом деле ))

Что там после покойного стимкрафта?
Есть попытки ворваться в стим с новым проектом?

pax 28.09.2020 12:19

Ответ: Вызов гуя, есть проблемы.
 
Цитата:

Сообщение от Crystal (Сообщение 317624)
Твою бы активность да в собственный проект )
Это уже оффтоп, но я всегда допускаю оффтопство в своих темах.
Даже хелсбар оффтоп на самом деле ))

Что там после покойного стимкрафта?
Есть попытки ворваться в стим с новым проектом?

Собственных проектов сейчас нет. Не могу придумать ничего интересного.

Crystal 28.09.2020 12:28

Ответ: Вызов гуя, есть проблемы.
 
Цитата:

Сообщение от pax (Сообщение 317625)
Собственных проектов сейчас нет. Не могу придумать ничего интересного.

ММО идея тухлая, сам уже наверно понял. Нужен сингл, он не минусанёт счёт.
Если нужно придумывать, обращайся, геймдиз вартича к твоим услугам ))
У меня куча вообще нереализованных игр, или заброшенных вначале.
Даже уже могу предложить кое что, где не придётся моделить и анимировать человеков,
эта идея улетела в ящик уже 13 лет как.

pax 28.09.2020 12:43

Ответ: Вызов гуя, есть проблемы.
 
Цитата:

Сообщение от Crystal (Сообщение 317626)
ММО идея тухлая, сам уже наверно понял. Нужен сингл, он не минусанёт счёт.
Если нужно придумывать, обращайся, геймдиз вартича к твоим услугам ))
У меня куча вообще нереализованных игр, или заброшенных вначале.
Даже могу предложить кое что, где не придётся моделить и анимировать человеков.

Спасибо за предложение, но я пока не готов браться за что-то. Можно считать что я на отдыхе :)


Часовой пояс GMT +4, время: 03:09.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot