Плавное прекращение движения объекта

Общие вопросы о Unity3D

Плавное прекращение движения объекта

Сообщение ba3uk 21 июн 2019, 13:25

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

Пока что смог научить камеру лишь передвижению.

Синтаксис:
Используется csharp
                        if (Input.GetMouseButtonDown(0)) startPos = cam.ScreenToWorldPoint(Input.mousePosition);
                        else if (Input.GetMouseButton(0))
                        {
                                posX = cam.ScreenToWorldPoint(Input.mousePosition).x - startPos.x  +transform.position.x;
                                posY = cam.ScreenToWorldPoint(Input.mousePosition).y - startPos.y +transform.position.y;
                                targetPos = new Vector3(posX, posY, transform.position.z);
                        }


                        transform.position = Vector3.Lerp(transform.position, targetPos, currentSpeed * Time.deltaTime);


Может кто уже делал что-то подобное или может знает в какую сторону думать.
Знаю про "Mathf.Clamp()" но он резко ограничивает все контуры, а меня это расстраивает.
Заранее спасибо за помощь.
ba3uk
UNец
 
Сообщения: 6
Зарегистрирован: 25 сен 2017, 10:51


Re: Плавное прекращение движения объекта

Сообщение ba3uk 25 июн 2019, 08:03



Спасибо большое
ba3uk
UNец
 
Сообщения: 6
Зарегистрирован: 25 сен 2017, 10:51

Re: Плавное прекращение движения объекта

Сообщение ba3uk 25 июн 2019, 08:08

А вообще нашел такое решение, все очень просто и гармонично получилось. Сразу прикрутил Зум.

Синтаксис:
Используется csharp
                void Update()
                {
                        if (Input.GetMouseButtonDown(0))                       
                                startPos = cam.ScreenToWorldPoint(Input.mousePosition);
                        else if (Input.GetMouseButton(0))
                        {
                                posX = cam.ScreenToWorldPoint(Input.mousePosition).x - startPos.x  +transform.position.x;
                                posX =Mathf.Clamp(posX, min.x, max.x);
                               
                                posY = cam.ScreenToWorldPoint(Input.mousePosition).y - startPos.y +transform.position.y;
                                posY = Mathf.Clamp(posY, min.y, max.y);
                               
                                targetPos = new Vector3(posX, posY, transform.position.z);
                        }

                        transform.position = Vector3.Lerp(transform.position, targetPos, speed * Time.deltaTime);

                       
#if UNITY_EDITOR
                        if (Input.GetAxis("Mouse ScrollWheel") != 0)
                        {
                                Zoom(Input.GetAxis("Mouse ScrollWheel"));
                        }
#else
                        if (Input.touchCount == 2)
                        {
                                Touch finger_1 = Input.GetTouch(0);
                                Touch finger_2 = Input.GetTouch(1);

                                Vector2 prevPos_1 = (finger_1.position - finger_1.deltaPosition);
                                Vector2 prevPos_2 = (finger_2.position - finger_2.deltaPosition);


                                float prevMagnitude = (prevPos_1 - prevPos_2).magnitude;
                                float currentMagnitude = (finger_1.position - finger_2.position).magnitude;

                                float difference = currentMagnitude - prevMagnitude;
                               
                                Zoom(difference * 0.01f);
                        }
#endif
                }

                void Zoom(float increment)
                {
                        transform.localScale = Clamp(transform.localScale + scaleSpeed * increment, 0.5f, 1.3f);
                        CalculateBounds();
                }

                // Высчитываем границы спрайта в мировых координатах
                void CalculateBounds()
                {
                        if (boundsMap == null) return;
                       
                        Bounds bounds = boundsMap.CalculateBounds();
                        Bounds camera2DBounds = Camera2DBounds();
                        min = boundsMap.transform.TransformPoint(bounds.min) +  camera2DBounds.max;
                       
                        max = boundsMap.transform.TransformPoint(bounds.max) + camera2DBounds.min;
                }

                // определяем границы камеры
                Bounds Camera2DBounds()
                {
                        float height = cam.orthographicSize * 2;
                        return new Bounds(Vector3.zero, new Vector3(height * cam.aspect, height, 0));
                }
               
                // сглаживание векторов
                public Vector3 Clamp(Vector3 value , float Min, float Max)
                {
                        value.x = Mathf.Clamp(value.x, Min, Max);
                        value.y = Mathf.Clamp(value.y, Min, Max);
                        value.z = value.z;
                        return value;
                }


Зум реализован спцифично - не трогаю камеру, изменяю размер объектов камеры. В связи с этим возникает интересная проблема , изображение сдвигается когда зумируется. И я не знаю как можно это пофиксить, может есть какие мысли ? Как отследить на сколько смешается данная тачка, где мы находимся и двигаться за ней
ba3uk
UNец
 
Сообщения: 6
Зарегистрирован: 25 сен 2017, 10:51


Вернуться в Общие вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15