Как запретить передвижение по оси

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Как запретить передвижение по оси

Сообщение Grayzee 25 май 2017, 13:09

Здравствуйте!
У меня на объекте висит скрипт для передвижения по клику (или за мышью), но проблема в том что если кликнуть по самому объекту то он начинает "взлетать". Пробовал в инспекторе ставить Freeze position - не помогло.

Сам код:
Синтаксис:
Используется csharp
public class playerMove : MonoBehaviour {

        Vector3 curPosition;
        Vector3 nextPosition;
        public float speed;
        public bool isMove = false;
        GameObject obj;

        // Use this for initialization
        void Start () {
                isMove = false;
                curPosition = transform.position;
                nextPosition = transform.position;
                obj = GameObject.Find ("Cube");
        }
       
        // Update is called once per frame
        void Update () {
                if (Input.GetMouseButtonDown (0) || Input.GetMouseButton (0)) {
                                isMove = true;

                                RaycastHit hit;
                                Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);

                                if (Physics.Raycast (ray, out hit)) {
                                        nextPosition = hit.point;
                                }
                }

                if (curPosition != nextPosition && isMove == true) {
                        transform.position = Vector3.MoveTowards(transform.position, nextPosition, Time.deltaTime * speed);
                        transform.LookAt(nextPosition);
                        if(transform.position == nextPosition){
                                isMove = false;
                        }
                }
        }
}
 


Как это можно исправить? Может,как то проверить куда именно попал луч?(но как?)
За ранее большое спасибо!
Grayzee
UNец
 
Сообщения: 4
Зарегистрирован: 25 май 2017, 12:51

Re: Как запретить передвижение по оси

Сообщение Valentinus 25 май 2017, 14:20

у вас стоит nextPosition = hit.point;

то есть вы перемещаете персонажа (а как правило его центр - это ноги, пятки) к точке касания , а оно получается по макушке или тушке, поэтому он и взлетает.
решения:

1. если у вас поверхность плоская и везде y=0, то можете просто после этой строки обнулить nextPosition.y=0
2. если не плоская, то лучше землю вынести на отдельный слой, и в Raycast задавать этот слой, чтобы искалось пересечение только с землей
3. если персонажу разрешено вставать не только на землю, но и какие-то предметы (тележки, платформы, черепахи, и т.п.), то можно использовать RaycastAll , и из всех пересечений выбрать пересечение с разрешенными объектами (по их названиям или тегам).
типа
Синтаксис:
Используется csharp
 RaycastHit[] hits;
                                        hits = Physics.RaycastAll (ray, 1000.0F);
                                        for (int i = 0; i < hits.Length; i++) {          
                                                if (hits [i].transform.tag == "ground")
                                                                 {nextPosition = hits [i].point;
                                                                 break;}
}
Последний раз редактировалось Valentinus 25 май 2017, 15:34, всего редактировалось 1 раз.
другое мое творчество: samlib.ru/u/us_w/
Аватара пользователя
Valentinus
Старожил
 
Сообщения: 889
Зарегистрирован: 24 мар 2017, 18:33

Re: Как запретить передвижение по оси

Сообщение Grayzee 25 май 2017, 15:01

Спасибо! Всё получилось!
Grayzee
UNец
 
Сообщения: 4
Зарегистрирован: 25 май 2017, 12:51


Вернуться в Почемучка

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

Сейчас этот форум просматривают: GoGo.Ru [Bot] и гости: 31