Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Unity > Общие вопросы

Общие вопросы вопросы не попадающие ни в один из доступных разделов

Ответ
 
Опции темы
Старый 09.11.2011, 00:35   #1
defz
AnyKey`щик
 
Регистрация: 09.11.2011
Сообщений: 19
Написано 0 полезных сообщений
(для 0 пользователей)
Проблема со скриптом

Всем привет. Есть скрипт движения по точкам. Все движется, но не так как надо. При координате объекта (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;
			}
        }
    }

}
(Offline)
 
Ответить с цитированием
Старый 09.11.2011, 01:19   #2
Aikon
ПроЭктировщик
 
Регистрация: 12.02.2011
Сообщений: 131
Написано 23 полезных сообщений
(для 52 пользователей)
Ответ: Проблема со скриптом

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

P.S. А что такое all_Points? Где ты их задал. Если в редакторе, то как? Хочу попробовать сделать.
(Offline)
 
Ответить с цитированием
Старый 09.11.2011, 04:31   #3
Lestar
Бывалый
 
Аватар для Lestar
 
Регистрация: 24.05.2011
Адрес: Украина,Харьков
Сообщений: 890
Написано 359 полезных сообщений
(для 880 пользователей)
Ответ: Проблема со скриптом

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 в 08:01.
(Offline)
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо Lestar за это полезное сообщение:
Aikon (09.11.2011), defz (09.11.2011), pax (09.11.2011)
Старый 09.11.2011, 07:33   #4
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Проблема со скриптом

Поправил предыдущий пример.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Lestar (09.11.2011)
Старый 09.11.2011, 10:36   #5
defz
AnyKey`щик
 
Регистрация: 09.11.2011
Сообщений: 19
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Проблема со скриптом

Все работает, но до того момента, когда я начинаю двигать объект по диагонали. Он просто начинает вращатся по орбите вокруг вейпоинта.
(Offline)
 
Ответить с цитированием
Старый 09.11.2011, 12:58   #6
Aikon
ПроЭктировщик
 
Регистрация: 12.02.2011
Сообщений: 131
Написано 23 полезных сообщений
(для 52 пользователей)
Ответ: Проблема со скриптом

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

Ошибка скорее всего тут
> transform.Translate((waypoint[i+1].position - waypoint[i].position).normalized * movement );
Надо делать перенос по глобальным координатам.
(Offline)
 
Ответить с цитированием
Старый 09.11.2011, 22:03   #7
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Проблема со скриптом

Я на самом деле не пользуюсь транслейтом, решил оставить в примере. Видно не надо было...
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;
                }
            }
        }
    }

__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо pax за это полезное сообщение:
Aikon (09.11.2011), defz (09.11.2011)
Старый 09.11.2011, 23:00   #8
defz
AnyKey`щик
 
Регистрация: 09.11.2011
Сообщений: 19
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Проблема со скриптом

Большое спасибо, все работает как надо. И еще 1 вопрос: будет ли работать скрипт если я добавлю поворот объекта путем получения угла поворота вейпоинта, т.е. оси вейпоинта будут не параллельны глобальным осям?
(Offline)
 
Ответить с цитированием
Старый 10.11.2011, 00:43   #9
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Проблема со скриптом

будет
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com