Прямолинейное движение и по кривой

Программирование на Юнити.

Прямолинейное движение и по кривой

Сообщение c0nail 06 мар 2014, 11:35

Если честно надо было сделать банальное передвижение , но с использованием лерпа , iTweena в конце движения объект сильно притормаживал(, работал корректно только Vector3.MoveTowards но тут не устроило что задается скорость а не время за которое необходимо пройти расстояние ( вот и решил накалякать свой скриптик , можно его под чистить но впадлу ))))
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class MoveObject : MonoBehaviour {

        private float time;
        public float currFrame = 1;
        public float n;
        private Vector3 From = new Vector3();
        private Vector3 To = new Vector3();
        private bool start = false;
        private int type;
        // Use this for initialization
        void Start () {
        }
       
        // Update is called once per frame
        void Update () {

                if (start && type == 1)
                {
                        float dX = (To.x - From.x);
                        float dY = (To.y - From.y);
                        transform.position = new Vector3(From.x + (dX/n)*currFrame ,From.y + (dY/n)*currFrame ,transform.position.z);
                        currFrame++;
                        if(Mathf.Abs(transform.position.x - To.x) < 0.01 && Mathf.Abs(transform.position.y - To.y) < 0.01)
                        {
                                transform.position = To;
                                start = false;
                                GameObject.Destroy(transform.GetComponent<MoveObject>());
                        }
                }

                if (start && type == 2)
                {
                        float dX = (To.x - From.x);
                        float dY = (To.y - From.y);
               
                        transform.position = new Vector3(From.x + (dX/n)*currFrame ,From.y + dY*(Mathf.Pow(currFrame/n,3)) ,transform.position.z);
                        currFrame++;
                        if(Mathf.Abs(transform.position.x - To.x) < 0.01 && Mathf.Abs(transform.position.y - To.y) < 0.01)
                        {
                                transform.position = To;
                                start = false;
                                GameObject.Destroy(transform.GetComponent<MoveObject>());
                        }
                }
       
        }

        private void Move(Transform T, Vector3 To , float Second)
        {
                From = T.position;
                this.To = To;
                n = (int)(Time.timeScale/Time.deltaTime * Second);
                start = true;
                type = 1;
        }

        private void MoveCurve(Transform T, Vector3 To , float Second)
        {
                From = T.position;
                this.To = To;
                n = (int)(Time.timeScale/Time.deltaTime * Second);
                start = true;
                type = 2;
        }

        public static void StartMove(Transform T, Vector3 To , float Second)
        {
                MoveObject s = T.gameObject.AddComponent ("MoveObject") as MoveObject;
                s.Move (T, To, Second);
        }

        public static void StartMoveCurve(Transform T, Vector3 To , float Second)
        {
                MoveObject s = T.gameObject.AddComponent ("MoveObject") as MoveObject;
                s.MoveCurve (T, To, Second);
        }


}


Кидаем класс просто в проект , для использования делаем такие действия
Синтаксис:
Используется csharp
MoveObject.StartMove ( Transform объекта который перемещяем , Vector3 куда добраться , float Время в секундах );
 

StartMove = Прямолинейное
StartMoveCurve = По дуге .
Надеюсь кому то будет полезен.
c0nail
UNIт
 
Сообщения: 92
Зарегистрирован: 07 дек 2012, 23:39

Re: Прямолинейное движение и по кривой

Сообщение klimentievU 10 окт 2018, 15:58

Синтаксис:
Используется csharp
using UnityEngine;

namespace Assets.Animations.DropObjects {
        public class MoveObject : MonoBehaviour {
                private float _time;
                [SerializeField] private float _currFrame = 1;
                [SerializeField] private float _n;
                private Vector3 _from;
                private Vector3 _to;
                private bool _start;

                private int _type;

                void Update() {
                        if (_start && _type == 1) {
                                float dX = _to.x - _from.x;
                                float dY = _to.y - _from.y;
                                transform.position =
                                        new Vector3(_from.x + (dX / _n) * _currFrame , _from.y + (dY / _n) * _currFrame , transform.position.z);
                                _currFrame ++;
                                if (Mathf.Abs(transform.position.x - _to.x) < 0.01 && Mathf.Abs(transform.position.y - _to.y) < 0.01) {
                                        transform.position = _to;
                                        _start             = false;
                                        Destroy(transform.GetComponent<MoveObject>());
                                }
                        }

                        if (_start && _type == 2) {
                                float dX = _to.x - _from.x;
                                float dY = _to.y - _from.y;

                                transform.position = new Vector3(_from.x + (dX / _n) * _currFrame ,
                                        _from.y + dY * (Mathf.Pow(_currFrame / _n, 3)),
                                        transform.position.z);
                                _currFrame ++;
                                if (Mathf.Abs(transform.position.x - _to.x) < 0.01 && Mathf.Abs(transform.position.y - _to.y) < 0.01) {
                                        transform.position = _to;
                                        _start             = false;
                                        Destroy(transform.GetComponent<MoveObject>());
                                }
                        }
                }

                private void Move(Transform trans, Vector3 to, float second) {
                        _from  = trans.position;
                        _to    = to;
                        _n      = (int) (Time.timeScale / Time.deltaTime * second);
                        _start = true;
                        _type  = 1;
                }

                private void MoveCurve(Transform trans, Vector3 to, float second) {
                        _from  = trans.position;
                        _to    = to;
                        _n      = (int) (Time.timeScale / Time.deltaTime * second);
                        _start = true;
                        _type  = 2;
                }

                public static void StartMove(Transform transform, Vector3 to, float second) {
                        MoveObject s = transform.gameObject.AddComponent<MoveObject>();
                        s.Move(transform, to, second);
                }

                public static void StartMoveCurve(Transform transform, Vector3 to, float second) {
                        MoveObject s = transform.gameObject.AddComponent<MoveObject>();
                        s.MoveCurve(transform, to, second);
                }
        }
}

 
klimentievU
UNец
 
Сообщения: 1
Зарегистрирован: 10 окт 2018, 15:54

Re: Прямолинейное движение и по кривой

Сообщение Tolking 10 окт 2018, 16:53

Синтаксис:
Используется csharp
    IEnumerator MoveCurve(Transform tr, Vector3 EndPos, float sec,float h)
    {
        Vector3 StartPos = tr.position;
        float t = 0;
        while (t <= sec)
        {
            t += Time.deltaTime;
            tr.position = Vector3.Lerp(StartPos, EndPos, t / sec)+Vector3.up*h*Mathf.Sin(Mathf.Lerp(0,Mathf.PI,t / sec));
            yield return null;
        }
    }
 
Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 2714
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула


Вернуться в Скрипты

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

Сейчас этот форум просматривают: Yandex [Bot] и гости: 6