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

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

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

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

Ответ
 
Опции темы
Старый 22.07.2012, 19:04   #1
Huruffus
Оператор ЭВМ
 
Регистрация: 22.07.2012
Сообщений: 37
Написано одно полезное сообщение
следование объекта за мышью

Здравствуйте! совсем недавно начал изучать Юнити.
Начал писать скрипт по передвижению объекта с помощью мыши в плоскости. Т.е. нажал на объект и начинаешь передвигать мышь, а он за ней. Каким образом это реализовать?
(Offline)
 
Ответить с цитированием
Старый 22.07.2012, 19:23   #2
Taugeshtu
scientist.alien
 
Аватар для Taugeshtu
 
Регистрация: 12.02.2007
Сообщений: 2,098
Написано 1,030 полезных сообщений
(для 2,593 пользователей)
Ответ: следование объекта за мышью

Смотри в Scripting Reference:
Transform.Position
Transform.Move
Vector3.MoveTowards
Input.GetAxis (+ Reference и Manual по Input)
Physics.RayCast (как вариант)
MonoBehaviour.OnMouseDrag

В общем логика такая:
Пока юзер держит мышу на объекте - перемещаем объект вместе с мышой, для чего определяем "целевую" координату либо райкастом по плоскости, либо исходя из перемещения мыши (такой вариант годен, когда курсор скрывается на время перемещений объектов, ибо можно нипапасть).
А перемещение объекта - это либо прямое позиционирование в точку попадания райкаста, либо смещение через модификацию позиции/специальный метод Move, либо извращенно-утонченное интерполирование между двух координат через класс Vector3.
Выбирай наиболее подходящий вариант и читай справку.
(Offline)
 
Ответить с цитированием
Старый 22.07.2012, 21:03   #3
Huruffus
Оператор ЭВМ
 
Регистрация: 22.07.2012
Сообщений: 37
Написано одно полезное сообщение
Ответ: следование объекта за мышью

Спасибо)

перед тем как писать перемещение мышью, я хотел написать "активацию объекта", т.е. надимаем на нужный объект, а он взлетает на несколько сантиметров вверх.

Дак вот, я написал этот скрипт. Команду по плавному перемещению из точки в точку, кроме Vector3.Slerp, я не нашёл. Но и Slerp не работает. Он мнгновенно перемещает. Пришлось писать цикл, чтобы перемещение казалось плавным, т.е. перемещается по чуть-чуть.

Но этот скрипт не работает.
Посмотрите пожалуйста в чём дело?
А также предложите команды по плавному перемещению.

using UnityEngine;
using System.Collections;

public class 
transformIngreedients MonoBehaviour {
    public 
GameObject EmptyUp
    
    
void Start () {
        
gameObject.collider.enabled true;
        
EmptyUp GameObject.Find("EmptyUP");
    }
    
    
void OnMouseDown() {
        
Debug.Log("OnMouseDown");
        for (
int i 150i++){
            
transform.position Vector3.Slerp(transform.positionEmptyUp.transform.position0.005F);    
            
rigidbody.useGravity false;
        }
    }
    
void OnMouseExit(){
    
Debug.Log("OnMouseExit");

(Offline)
 
Ответить с цитированием
Старый 22.07.2012, 21:25   #4
Taugeshtu
scientist.alien
 
Аватар для Taugeshtu
 
Регистрация: 12.02.2007
Сообщений: 2,098
Написано 1,030 полезных сообщений
(для 2,593 пользователей)
Ответ: следование объекта за мышью

Посмотрите пожалуйста в чём дело?
Давай промотаем твой код в голове:
Шаг 1. Юнити выполняет свою внутреннюю логику.
Шаг 2. Юнити пробегает по событиям и обнаруживает, что игрок держит кнопку мыши над объектом.
Шаг 3. Юнити передаёт бразды правления твоему скрипту.
Шаг 4. Твой скрипт 50 раз сферически интерполирует позицию объекта.
Шаг 5. Юнити отрисовывает сцену.

Собственно, "почему так" ты сейчас должен понять. Подскажу как исправить:
Когда игрок кликает по объекту, тебе стоит устанавливать некоторую переменную-таймер, а потом в Update() (или FixedUpdate()) проверять, включен ли этот таймер или нет (сравнивая с текущим временем, например), и если таки да - чуть-чуть двигать объект. Один шажочек за один такт.

А также предложите команды по плавному перемещению.
Vector3.Lerp
Vector3.MoveTowards
Vector3.SmoothDamp
Любая из них. Проще всего работать будет со второй. Выглядеть будет так (JS):
transform.position = Vector3.MoveTowards(transform.position, destination_vector3, max_speed*Time.deltaTime);
Зачем использовать Time.deltaTime:
Потому что так мы можем задавать переменную max_speed в еденицах в секунду. Это очень удобно, на мой взгляд, очень человекоориентированно.
Нюанс: если мы эти действия совершаем в FixedUpdate, то использовать нужно Time.fixedDeltaTime.
(Offline)
 
Ответить с цитированием
Старый 22.07.2012, 21:53   #5
Huruffus
Оператор ЭВМ
 
Регистрация: 22.07.2012
Сообщений: 37
Написано одно полезное сообщение
Ответ: следование объекта за мышью

Спасибо за команды, но я так и не понял почему мой код не работает.
Что за переменная - таймер? в Скрипт Референсе (unity3d.com) "timer" не нашёл
(Offline)
 
Ответить с цитированием
Старый 22.07.2012, 22:18   #6
Huruffus
Оператор ЭВМ
 
Регистрация: 22.07.2012
Сообщений: 37
Написано одно полезное сообщение
Ответ: следование объекта за мышью

MoveTowards не даёт плавных результатов. Я имел в виду: нажимаешь кнопку(1 раз), и объект плавно , без рывков, движется к цели
(Offline)
 
Ответить с цитированием
Старый 22.07.2012, 22:34   #7
Taugeshtu
scientist.alien
 
Аватар для Taugeshtu
 
Регистрация: 12.02.2007
Сообщений: 2,098
Написано 1,030 полезных сообщений
(для 2,593 пользователей)
Ответ: следование объекта за мышью

Что за переменная - таймер?
Любая созданная тобой переменная, которой в определённых условиях назначается время (текущее или будущее, или прошлое...), и которая сравнивается со временем (текущим, будущим или прошлым).

но я так и не понял почему мой код не работает.
Окей, давай ещё раз:
  • Ты берёшь шахматную фигурку и садишься с ней в руке за гладкий полированый стол.
  • Ты ставишь фигурку на ближний к тебе край стола.
  • Ты закрываешь глаза.
  • Ты 50 раз чуть-чуть двигаешь фигурку вперёд от себя.
  • Ты открываешь глаза и видишь резкое перемещение.

А надо так:
  • ...
  • Ты закрываешь глаза.
  • Ты 1 раз чуть-чуть двигаешь фигурку.
  • Ты открываешь глаза.
  • Ты снова закрываешь глаза.
  • Ты 1 раз чуть-чуть двигаешь фигурку.
  • Ты открываешь глаза.
  • ...
(Offline)
 
Ответить с цитированием
Старый 22.07.2012, 22:41   #8
cahekp
Разработчик
 
Аватар для cahekp
 
Регистрация: 14.12.2008
Адрес: Томск
Сообщений: 530
Написано 270 полезных сообщений
(для 883 пользователей)
Ответ: следование объекта за мышью

Добавлю:
У тебя цикл вообще ни разу не выполняется.

Чтобы цикл выполнялся 50 раз нужно вместо этого:
for (int i = 1; i > 50; i++)
Писать вот это:
for (int i = 0; i < 50; i++)
__________________
(Offline)
 
Ответить с цитированием
Старый 22.07.2012, 23:00   #9
Huruffus
Оператор ЭВМ
 
Регистрация: 22.07.2012
Сообщений: 37
Написано одно полезное сообщение
Ответ: следование объекта за мышью

спасибо за объяснение

ошибку нашёл

стыдно уже такие вопросы спрашивать
(Offline)
 
Ответить с цитированием
Старый 23.07.2012, 02:24   #10
Huruffus
Оператор ЭВМ
 
Регистрация: 22.07.2012
Сообщений: 37
Написано одно полезное сообщение
Ответ: следование объекта за мышью

написал часть скрипта. Как только появляется мышка на экране, сразу же начинает перемещаться объект. В сцене 2 перпендикулярно поставленные плоскости. Мышка по ним скользит - по ним же скользит объект.

Но дело в том, что по вертикальной плоскости объект движется более-менее нормально(иногда плавно движется от камеры к плоскости), а по горизонтальной скачет от камеры к точке на плоскости с большущей частотой.

Раньше объект скакал и по вертикальной плосскости, но после включения isKinematic почти перестал.

А ещё до этого объект крутился в разные стороны - решилось строчками:
Quaternion deltaRotation = Quaternion.Euler(rot);
rigidbody.MoveRotation(deltaRotation);


как это исправить?

скрипт:
using UnityEngine;
using System.Collections;

public class 
transformIngreedients MonoBehaviour {    
    public 
Ray _ray;
    public 
RaycastHit _hit;
    
    public 
Vector3 rot = new Vector3(0,0,0);    
    
    
void Start () {
        
gameObject.collider.enabled true;
    }
    
    
void Update() {
            
_ray Camera.main.ScreenPointToRay(Input.mousePosition);
            if (
Physics.Raycast(_rayout _hit1)){
                
rigidbody.isKinematic true;//-------------------------------------
                //запрещаю поворачиваться
                
Quaternion deltaRotation Quaternion.Euler(rot);
                
rigidbody.MoveRotation(deltaRotation);
                
//------------
                
rigidbody.detectCollisions false;
                
transform.position _hit.point;
            }
        }

(Offline)
 
Ответить с цитированием
Старый 23.07.2012, 02:51   #11
Taugeshtu
scientist.alien
 
Аватар для Taugeshtu
 
Регистрация: 12.02.2007
Сообщений: 2,098
Написано 1,030 полезных сообщений
(для 2,593 пользователей)
Ответ: следование объекта за мышью

скачет от камеры к точке на плоскости с большущей частотой
Предположу, что райкаст сначала цепляет поверхность, потом цепляет объект, ставит объект чуть ближе к камере, снова цепляет объект, снова ставит его чуть ближе к камере... Ну ты понял.

Если я прав, вылечить просто. В юнити есть такая штука, как слои. Слои могут быть использованы, чтобы селективно вырубить (или врубить) объекты из(в) райкаста/рендера/ещё-какой-нибудь-хрени. Тебе нужно либо делать райкаст только по слою, на котором твоя плоскость, либо делать райкаст по всем слоям кроме того, на котором твой объект. Тут зависит от задачи, в общем-то, и дополнительной нагрузки на другие слои (если таковые имеются/планируются)...
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Huruffus (23.07.2012)
Старый 23.07.2012, 03:24   #12
Huruffus
Оператор ЭВМ
 
Регистрация: 22.07.2012
Сообщений: 37
Написано одно полезное сообщение
Ответ: следование объекта за мышью

Спасибо) Буду ковырять их
(Offline)
 
Ответить с цитированием
Старый 23.07.2012, 16:24   #13
Huruffus
Оператор ЭВМ
 
Регистрация: 22.07.2012
Сообщений: 37
Написано одно полезное сообщение
Ответ: следование объекта за мышью

убрал на другой слой, всё пришло в норму.

теперь делаю, чтобы луч выпускался только по нажатию ЛКМ. Сделал, запускаю - пишет, что нет коллайдера у объекта. А мой объект из составных коллайдеров, а объект родитель коллайдера не имеет вовсе. Если добавить родителю коллайдер, то вовсе нет реакции никакой.
Дайте пожалуйста совет, что с этим делать?

Код тот же. Нет ВРУ!
новый:
using UnityEngine;
using System.Collections;

public class 
transformIngreedients MonoBehaviour {    
    public 
Ray _ray;
    public 
RaycastHit _hit;
    
    public 
Vector3 rot = new Vector3(0,0,0);    
    
    
void Start () {
        
gameObject.collider.enabled true;
    }
    
    
void OnMouseDown() {
        
Debug.Log("Down");
            
_ray Camera.main.ScreenPointToRay(Input.mousePosition);
            if (
Physics.Raycast(_rayout _hit1)){
                
//запрещаю поворачиваться
                
Quaternion deltaRotation Quaternion.Euler(rot);
                
rigidbody.MoveRotation(deltaRotation);
                
//------------
                
rigidbody.detectCollisions true;
                
transform.position _hit.point;
            }
    } 
}

Скрин с составного объекта:
Миниатюры
Нажмите на изображение для увеличения
Название: Снимок.JPG
Просмотров: 7923
Размер:	22.6 Кб
ID:	17218  
(Offline)
 
Ответить с цитированием
Старый 23.07.2012, 17:22   #14
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: следование объекта за мышью

Сообщение от Huruffus Посмотреть сообщение
void Start () {
        
gameObject.collider.enabled true;
    } 
Это действительно нужно?
Если да, то

void Start () {
        foreach(
Collider coll in GetComponentsInChildren<Collider>())
        {
              
coll .enabled true;
        }

__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Huruffus (24.07.2012)
Старый 24.07.2012, 00:54   #15
Huruffus
Оператор ЭВМ
 
Регистрация: 22.07.2012
Сообщений: 37
Написано одно полезное сообщение
Ответ: следование объекта за мышью

pax, спасибо за скрипт, но дело было не в этом.
Дело было в том, что я объект Колба переместил на слой "Ignore Raycast". После этого коллайдеры стали невосприимчивыми к мышке.

Каким образом сделать коллайдеры восприимчивыми к мышке, а объект заставить игнорировать Лучи?
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

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

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


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


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