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

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

СообщениеДобавлено: 25 май 2017, 13:09
Grayzee
Здравствуйте!
У меня на объекте висит скрипт для передвижения по клику (или за мышью), но проблема в том что если кликнуть по самому объекту то он начинает "взлетать". Пробовал в инспекторе ставить 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;
                        }
                }
        }
}
 


Как это можно исправить? Может,как то проверить куда именно попал луч?(но как?)
За ранее большое спасибо!

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

СообщениеДобавлено: 25 май 2017, 14:20
Valentinus
у вас стоит 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;}
}

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

СообщениеДобавлено: 25 май 2017, 15:01
Grayzee
Спасибо! Всё получилось!