forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Общие вопросы (http://forum.boolean.name/forumdisplay.php?f=166)
-   -   Проблема со скриптом (http://forum.boolean.name/showthread.php?t=15816)

defz 09.11.2011 00:35

Проблема со скриптом
 
Всем привет. Есть скрипт движения по точкам. Все движется, но не так как надо. При координате объекта (Y = 1.284865) и такой же самой координате у точки объект всеравно продолжает менять свой Y. А в конце движения объект вообще поднимается примерно в 2 раза выше исходной координаты. По идее скорость по оси Y должна равнятся 0, но получается что это не так.
Код:

using UnityEngine;
using System.Collections;

public class WaypointMove : MonoBehaviour
{
        public float speed_move = 2f;
        public int points_count;
       
        private Transform _thisTransform;
    public Transform waypoint_0;
    public Transform waypoint_1;

    Transform[] waypoints = new Transform[2];

    private int i = 0;
    private float distance;
        private float target_x;
        private float target_y;
        private float target_z;
        private float speed_x;
        private float speed_y;
        private float speed_z;
       
    void Start()
    {
                _thisTransform = transform;
               
        waypoints[0] = waypoint_0;
        waypoints[1] = waypoint_1;
    }

    void Update()
    {
                target_x = all_Points[i].position.x;
                target_y = all_Points[i].position.y;
                target_z = all_Points[i].position.z;
               
                distance = Mathf.Sqrt((Mathf.Pow(_thisTransform.position.x - target_x, 2))-(Mathf.Pow(_thisTransform.position.y - target_y, 2))-(Mathf.Pow(_thisTransform.position.z - target_z, 2)));
               
                speed_x = ((target_x - _thisTransform.position.x)/distance)*speed_move;
                speed_y = ((target_y - _thisTransform.position.y)/distance)*speed_move;
                speed_z = ((target_z - _thisTransform.position.z)/distance)*speed_move;
                transform.Translate(speed_x*Time.fixedTime, speed_y*Time.fixedTime, speed_z*Time.fixedTime);
               
               
        if (distance < 0.1)
        {
            if (i < points_count)
            {
                i++;
            }
                        else
                        {
                                speed_move = 0;
                        }
        }
    }

}


Aikon 09.11.2011 01:19

Ответ: Проблема со скриптом
 
Unity не знаю, но distance у тебя считается очень странно.
Правильная формула
d = sqrt ((x- x0)(x- x0) + (y - y0)(y - y0) + (z - z0)(z - z0))

P.S. А что такое all_Points? Где ты их задал. Если в редакторе, то как? Хочу попробовать сделать.

Lestar 09.11.2011 04:31

Ответ: Проблема со скриптом
 
PHP код:

public class WaypointMove MonoBehaviour
{
    public 
float speed_move 10f;    
    public 
Transform [] waypoint;
    private 
int i=0;
    private 
bool move true;
    
    
void Update()
    {
        if (
move)
        {
            var 
direction waypoint[i].position transform.position;
            var 
distance direction.magnitude;
            
direction.Normalize(); 

            var 
movement speed_move *Time.deltaTime;
            if (
distance movement )
            {
                
transform.Translate(direction movement );
            }
            else
            {
                
transform.position waypoint[i].position;
                if (
waypoint.Length-1)
                {
                    
movement -= distance;
                    
transform.Translate((waypoint[i+1].position waypoint[i].position).normalized movement );
                    
i++;
                }
                else
                {
                    
move false;
                }
            }
        }
    }



pax 09.11.2011 07:33

Ответ: Проблема со скриптом
 
Поправил предыдущий пример.

defz 09.11.2011 10:36

Ответ: Проблема со скриптом
 
Все работает, но до того момента, когда я начинаю двигать объект по диагонали. Он просто начинает вращатся по орбите вокруг вейпоинта.

Aikon 09.11.2011 12:58

Ответ: Проблема со скриптом
 
defz, проверил: поставил кубик, повесил на него скрипт. waypoint - это dummy-объекты. Если оси кубика коллинеарны (параллельны) глобальным осям, то все ок. Если оси кубика повернуты, то шастает не правильно и крутится.

Ошибка скорее всего тут
> transform.Translate((waypoint[i+1].position - waypoint[i].position).normalized * movement );
Надо делать перенос по глобальным координатам.

pax 09.11.2011 22:03

Ответ: Проблема со скриптом
 
Я на самом деле не пользуюсь транслейтом, решил оставить в примере. Видно не надо было...
PHP код:

public class WaypointMove MonoBehaviour
{
    public 
float speed_move 10f;    
    public 
Transform [] waypoint;
    private 
int i=0;
    private 
bool move true;
    
    
void Update()
    {
        if (
move)
        {
            var 
direction waypoint[i].position transform.position;
            var 
distance direction.magnitude;
            
direction.Normalize(); 

            var 
movement speed_move *Time.deltaTime;
            if (
distance movement )
            {
                
transform.position += direction movement;
            }
            else
            {
                
transform.position waypoint[i].position;
                if (
waypoint.Length-1)
                {
                    
movement -= distance;
                    
transform.position += (waypoint[i+1].position waypoint[i].position).normalized movement;
                    
i++;
                }
                else
                {
                    
move false;
                }
            }
        }
    }



defz 09.11.2011 23:00

Ответ: Проблема со скриптом
 
Большое спасибо, все работает как надо. И еще 1 вопрос: будет ли работать скрипт если я добавлю поворот объекта путем получения угла поворота вейпоинта, т.е. оси вейпоинта будут не параллельны глобальным осям?

pax 10.11.2011 00:43

Ответ: Проблема со скриптом
 
будет


Часовой пояс GMT +4, время: 16:45.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot