Страница 1 из 1

Дрожит персонаж

СообщениеДобавлено: 21 сен 2020, 19:10
graniza
Здравствуйте! Вообщем мне необходимо сделать движение персонажа только по оси Z и ограничением по координатам(т.е., например, больше 8-ми нельзя и меньше 2-ух нельзя). Впринципе более-менее работает то, что написано в скрипте, но когда мышь оставляешь в покое, то персонаж начинает дрожать. Дрожит он, я думаю, из-за того что переменная всегда меняется почему-то, не могу понять почему. Игрушка на андроид, именно под тач еще не делал. Прикладываю еще картинку, как предполагается правильно. По сути движение наверное на движение в пинг понге похоже. По левой части экрана человек водит палец вверх-вниз, ГГ следует за пальцем игрока. Как-то так. Еще соответственно если палец идет вверх, то проигрывается одна анимация, вниз - другая. Это в коде сделано и вроде работает, но нет проверки на состояние, когда палец удерживается на одном месте или отпущен.
Синтаксис:
Используется csharp
public void Move()
    {
       

       
        target = new Vector3(-9, 1.46f, charac.transform.position.z);
       
        ray = cam.ScreenPointToRay(Input.mousePosition);

            if (Physics.Raycast(ray, out hit, ignoreLayers, terr))
            {
                hit.point = new Vector3(charac.transform.position.x, charac.transform.position.y, Mathf.Clamp(hit.point.z, zMin, zMax));
                var MT = Vector3.MoveTowards(target, hit.point, moveSpeed * Time.deltaTime);
                charac.transform.position = MT;

            }

           



            if (charac.transform.position.z < lastZ)
            {

                lastZ = charac.transform.position.z;
                anim.SetBool("pos_char", false);
                anim.SetBool("hold_pos_char", false);

            }
            else if (charac.transform.position.z > lastZ)
            {
                lastZ = charac.transform.position.z;
                anim.SetBool("pos_char", true);
                anim.SetBool("hold_pos_char", false);
            }

       

       


    }

Скрытый текст:
Изображение

Re: Дрожит персонаж

СообщениеДобавлено: 22 сен 2020, 11:16
Woland
Если мышь не двигается, то не двигай персонажа

Re: Дрожит персонаж

СообщениеДобавлено: 22 сен 2020, 12:53
graniza
Woland писал(а):Если мышь не двигается, то не двигай персонажа

Мышь не двигается, персонаж по факту не движется, но скачет переменная, когда происходит Movetowards я так полагаю. Вот как правильно сделать Movetowards, я вот не знаю, с этим нужна помощь. Полагаю движется персонаж постоянно к точке таргета(мыши), как остановить движение при остановке мыши, вот это вопрос для меня.

Re: Дрожит персонаж

СообщениеДобавлено: 22 сен 2020, 12:55
Woland
Просто не выполняй Move, если положение мыши не меняется

Re: Дрожит персонаж

СообщениеДобавлено: 22 сен 2020, 12:56
graniza
Woland писал(а):Просто не выполняй Move, если положение мыши не меняется

А как в коде это реализовать? Проверять координаты X и Y мыши?

Re: Дрожит персонаж

СообщениеДобавлено: 22 сен 2020, 14:22
1max1
Полный код дай, где вообще move вызывается и каким образом? И сразу тест, убери эту строчку: charac.transform.position = MT; и посмотри будет ли он дрожать.

Re: Дрожит персонаж

СообщениеДобавлено: 23 сен 2020, 17:53
graniza
1max1 писал(а):Полный код дай, где вообще move вызывается и каким образом? И сразу тест, убери эту строчку: charac.transform.position = MT; и посмотри будет ли он дрожать.

Код, конечно, дрянь, но что есть.
Синтаксис:
Используется csharp
public class Char_Shit : MonoBehaviourPunCallbacks
{
    public float moveSpeed = 0.1f;
    public float smoother = 3f;
    RaycastHit hit;
    Ray ray;
    public Camera cam;
    public LayerMask ignoreLayers;
    public LayerMask terr;
    public GameObject charac;
    public bool shooting;
    public bool idle;

    public float lookWeight;


    public float zMax;
    public float zMin;
    public float lastZ;

    Vector3 target;

    Animator anim;


    //Shooting
    public Transform targetTransform;
    public LayerMask mouseAimMask;
    public Gun_System gun;

    public bool walk = true;
    public bool animation_started = false;
    public bool animation_finished = true;

    void Start()
    {
        terr = LayerMask.GetMask("Terrain");
        zMax = 2;
        zMin = -8;
        lastZ = charac.transform.position.z;

        anim = GetComponent<Animator>();

    }


    void Update()
    {
       
        Move();
        Shoot_Player();

    }


     void FixedUpdate()
    {
        RotateToAim();

    }


 
    public void RotateToAim()
    {
        if (Input.GetButtonDown("Fire1"))
        {
            lookWeight = Mathf.Lerp(lookWeight, 1f, Time.deltaTime * smoother);

        }
        else
        {
            lookWeight = Mathf.Lerp(lookWeight, 0f, Time.deltaTime * 2.5f);
        }
    }
    public void Shoot_Player()
    {

        if (shooting == true)
        {
            anim.SetBool("shoot", true);
           
           
        }
        else if (shooting == false)
        {
           
            anim.SetBool("shoot", false);
           
        }

        if (idle == true)
        {
           
            anim.SetBool("idle", true);

        }
        else if (idle == false)
        {

            anim.SetBool("idle", false);

        }


        if (Input.GetButtonDown("Fire1"))
        {
            idle = false;
            shooting = true;

            gun.Shoot();
        }
        else if (shooting == true)
        {
           
           
            shooting = false;
        }

        else if (Input.GetButton("Fire1"))
        {

            gun.Shoot_ulti();
        }


       


    }

    public void Move()
    {

       

       
        target = new Vector3(-9, 1.46f, charac.transform.position.z);
       
        ray = cam.ScreenPointToRay(Input.mousePosition);

        if (Physics.Raycast(ray, out hit, Mathf.Infinity, mouseAimMask))
        {
            targetTransform.position = hit.point;

        }


       
            if (Physics.Raycast(ray, out hit, ignoreLayers, terr))
            {
                hit.point = new Vector3(charac.transform.position.x, charac.transform.position.y, Mathf.Clamp(hit.point.z, zMin, zMax));
                var MT = Vector3.MoveTowards(target, hit.point, moveSpeed * Time.deltaTime);
                charac.transform.position = MT;

                if (Input.GetMouseButtonDown(1)) {
                    walk = false;

                }
            }

           



            if (charac.transform.position.z < lastZ)
            {

                lastZ = charac.transform.position.z;
                anim.SetBool("pos_char", false);
                anim.SetBool("hold_pos_char", false);

            }
            else if (charac.transform.position.z > lastZ)
            {
                lastZ = charac.transform.position.z;
                anim.SetBool("pos_char", true);
                anim.SetBool("hold_pos_char", false);
            }

       

       


    }

   

     void OnAnimatorIK()
    {
       
            anim.SetLookAtWeight(lookWeight,1);
            anim.SetLookAtPosition(targetTransform.position);
       
       
           
       
       


    }

   


}

Re: Дрожит персонаж

СообщениеДобавлено: 26 сен 2020, 11:44
1max1
Что за магические константы?
target = new Vector3(-9, 1.46f, charac.transform.position.z);
И почему тут их нету?
hit.point = new Vector3(charac.transform.position.x, charac.transform.position.y
Еще возможно что анимация как-то влияет на это.
пс надеюсь еще актуально.

Re: Дрожит персонаж

СообщениеДобавлено: 26 сен 2020, 15:57
graniza
1max1 писал(а):Что за магические константы?
target = new Vector3(-9, 1.46f, charac.transform.position.z);
И почему тут их нету?
hit.point = new Vector3(charac.transform.position.x, charac.transform.position.y
Еще возможно что анимация как-то влияет на это.
пс надеюсь еще актуально.

[target = new Vector3(-9, 1.46f, charac.transform.position.z);] Это чтобы персонаж стоял в определенной точке уровня и двигался чтобы только по оси Z.
Я полагаю, что нужно сделать проверку - если мышь на месте, не двигается, то стоп анимация. Проблема в том, что когда мышь стоит, то персонаж все равно двигается на 0.0001 - 0.0003 единицы.

Re: Дрожит персонаж

СообщениеДобавлено: 05 окт 2020, 07:08
MrDmitry
Код действительно дрянь, без обид. Движение рекомендую делать через RigidBody2D логику переосмыслить и код переписать.

Re: Дрожит персонаж

СообщениеДобавлено: 08 окт 2020, 08:12
юnity
А без этого тоже дергаетса?
Синтаксис:
Используется csharp
void OnAnimatorIK()
    {
       
            anim.SetLookAtWeight(lookWeight,1);
            anim.SetLookAtPosition(targetTransform.position);
       
       
           
       
       


    }