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=17064)

Huruffus 22.07.2012 19:04

следование объекта за мышью
 
Здравствуйте! совсем недавно начал изучать Юнити.
Начал писать скрипт по передвижению объекта с помощью мыши в плоскости. Т.е. нажал на объект и начинаешь передвигать мышь, а он за ней. Каким образом это реализовать?

Taugeshtu 22.07.2012 19:23

Ответ: следование объекта за мышью
 
Смотри в Scripting Reference:
Transform.Position
Transform.Move
Vector3.MoveTowards
Input.GetAxis (+ Reference и Manual по Input)
Physics.RayCast (как вариант)
MonoBehaviour.OnMouseDrag

В общем логика такая:
Пока юзер держит мышу на объекте - перемещаем объект вместе с мышой, для чего определяем "целевую" координату либо райкастом по плоскости, либо исходя из перемещения мыши (такой вариант годен, когда курсор скрывается на время перемещений объектов, ибо можно нипапасть).
А перемещение объекта - это либо прямое позиционирование в точку попадания райкаста, либо смещение через модификацию позиции/специальный метод Move, либо извращенно-утонченное интерполирование между двух координат через класс Vector3.
Выбирай наиболее подходящий вариант и читай справку.

Huruffus 22.07.2012 21:03

Ответ: следование объекта за мышью
 
Спасибо)

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

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

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

PHP код:

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");



Taugeshtu 22.07.2012 21:25

Ответ: следование объекта за мышью
 
Цитата:

Посмотрите пожалуйста в чём дело?
Давай промотаем твой код в голове:
Шаг 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.

Huruffus 22.07.2012 21:53

Ответ: следование объекта за мышью
 
Спасибо за команды, но я так и не понял почему мой код не работает.
Что за переменная - таймер? в Скрипт Референсе (unity3d.com) "timer" не нашёл

Huruffus 22.07.2012 22:18

Ответ: следование объекта за мышью
 
MoveTowards не даёт плавных результатов. Я имел в виду: нажимаешь кнопку(1 раз), и объект плавно , без рывков, движется к цели

Taugeshtu 22.07.2012 22:34

Ответ: следование объекта за мышью
 
Цитата:

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

Цитата:

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

А надо так:
  • ...
  • Ты закрываешь глаза.
  • Ты 1 раз чуть-чуть двигаешь фигурку.
  • Ты открываешь глаза.
  • Ты снова закрываешь глаза.
  • Ты 1 раз чуть-чуть двигаешь фигурку.
  • Ты открываешь глаза.
  • ...

cahekp 22.07.2012 22:41

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

Чтобы цикл выполнялся 50 раз нужно вместо этого:
Код:

for (int i = 1; i > 50; i++)
Писать вот это:
Код:

for (int i = 0; i < 50; i++)

Huruffus 22.07.2012 23:00

Ответ: следование объекта за мышью
 
спасибо за объяснение

ошибку нашёл

стыдно уже такие вопросы спрашивать :)

Huruffus 23.07.2012 02:24

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

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

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

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


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

скрипт:
PHP код:

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;
            }
        }



Taugeshtu 23.07.2012 02:51

Ответ: следование объекта за мышью
 
Цитата:

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

Если я прав, вылечить просто. В юнити есть такая штука, как слои. Слои могут быть использованы, чтобы селективно вырубить (или врубить) объекты из(в) райкаста/рендера/ещё-какой-нибудь-хрени. Тебе нужно либо делать райкаст только по слою, на котором твоя плоскость, либо делать райкаст по всем слоям кроме того, на котором твой объект. Тут зависит от задачи, в общем-то, и дополнительной нагрузки на другие слои (если таковые имеются/планируются)...

Huruffus 23.07.2012 03:24

Ответ: следование объекта за мышью
 
Спасибо) Буду ковырять их

Huruffus 23.07.2012 16:24

Ответ: следование объекта за мышью
 
Вложений: 1
убрал на другой слой, всё пришло в норму.

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

Код тот же. Нет ВРУ!
новый:
PHP код:

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;
            }
    } 

}

Скрин с составного объекта:

pax 23.07.2012 17:22

Ответ: следование объекта за мышью
 
Цитата:

Сообщение от Huruffus (Сообщение 233892)
PHP код:

void Start () {
        
gameObject.collider.enabled true;
    } 


Это действительно нужно?
Если да, то

PHP код:

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



Huruffus 24.07.2012 00:54

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

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

Taugeshtu 24.07.2012 01:05

Ответ: следование объекта за мышью
 
Цитата:

Каким образом сделать коллайдеры восприимчивыми к мышке, а объект заставить игнорировать Лучи?
LayerMask
Это особое, магическое число, используемое для выбора слоёв для райкаста. Допустим, создадим новый слой, и будет он у нас иметь индекс 11 (ну так, навскидку... от 0 до 7 слои стандартные идут, встроенные)
Тогда магическое число, нужное нам, будет:
var _layer_mask = 1 << 11;
Операция " << 11" - это битовый сдвиг на 11 знаков. Если не знаешь двоичную систему счисления - не грузись.
Но сейчас в _layer_mask находится ТОЛЬКО 11 слой. Если мы, допустим, не хотим в 11 слой совать все объекты, по которым нужно пройтись райкастом, а хотим в 11 слой засунуть все объекты, по которым НЕ нужно райкастить, нам надо инвертировать маску. Делается так:
_layer_mask ~= _layer_mask;

А потом эту переменную _layer_mask применяем в райкасте. Всё.

Huruffus 24.07.2012 01:33

Ответ: следование объекта за мышью
 
Taugeshtu, спасибо, ели понял :)

Цитата:

Операция " << 11" - это битовый сдвиг на 11 знаков. Если не знаешь двоичную систему счисления - не грузись.
Двоичную систему счисления я знаю (00, 01, 10, 11, ...). Или это не всё?
"<< 11" - нужно применять всегда? Нельзя просто написать "_laer_masl = 11"?

Taugeshtu 24.07.2012 01:49

Ответ: следование объекта за мышью
 
Нельзя. Потому что _layer_mask = 11 даст тебе в двоичной системе:
000....01011
Т.е. такая маска будет включать слои с индексами 0, 1, и 3.
По сути, что мы делаем (если делаем правильно):
Приравниваем _layer_mask = 1.
Получаем:
000.....0001
А потом сдвигаем эту еденицу влево 11 раз, и получаем:
0000...0100000000000
Таким образом мы имеем в маске слой с индексом 11.

Huruffus 24.07.2012 02:07

Ответ: следование объекта за мышью
 
А как заставить объект игнорировать только один коллайдер?

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

Как заставить колбу игнорировать столкновения только со стеной?

Taugeshtu 24.07.2012 02:09

Ответ: следование объекта за мышью
 
Цитата:

Как заставить колбу игнорировать столкновения только со стеной?
Edit -> Project settings -> Physics
Там найдёшь Layers collision matrix, ну а дальше, думаю, разберёшься. Опять слои) Слои - карашо.

Huruffus 24.07.2012 02:14

Ответ: следование объекта за мышью
 
Слои - очень карашо!

добавил:
но я отыскал способ по-лучше: Physic.IgnoreCollision
http://docs.unity3d.com/Documentatio...Collision.html

добавил:
нет он не лучше, т.к. придётся прописывать это для каждого коллайдера в отдельности, а у меня их несколько в одном.
Ваш способ определённо лучше;)

Huruffus 24.07.2012 18:45

Ответ: следование объекта за мышью
 
Какой функцией можно возвратить текущую позицию?
И как сместить центр объекта в Unity?

Taugeshtu 24.07.2012 19:00

Ответ: следование объекта за мышью
 
Именно возвратить? Куда?)

Вообще, текущая позиция - вот она:
gameObject.transform.position
Не ленись чуть дольше лазить по справке.

Huruffus 25.07.2012 13:49

Ответ: следование объекта за мышью
 
я сделал так gameObject.transform.position = _hit.point, теперь трансформ позишен не является текущим положением.

а с проблемой я уже разобрался

pax 25.07.2012 14:16

Ответ: следование объекта за мышью
 
Делаешь поле
Vector3 originalPosition;
и перед строчкой gameObject.transform.position = _hit.point
пишешь originalPosition = gameObject.transform.position;
потом до следующего каста делаешь с originalPosition что тебе нужно.

Huruffus 07.08.2012 19:17

Ответ: следование объекта за мышью
 
Всем привет!

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

когда я отхожу от объекта выводит "не возможно взять", а когда подхожу к объекту, то надпись не меняется. Почему, скажите пожалуйста? Объект в сцене один.

Код:

public class takeObject : MonoBehaviour {
        public GameObject takeObj;
       
        void Start () {
        takeObj = GameObject.FindWithTag("canTake");
        }
       
        // Update is called once per frame
        void Update () {
        if (Vector3.Distance(takeObj.transform.position, gameObject.transform.position)<5)
                        print ("can take it");
                        else print ("can't take it");       
        }
}


pax 07.08.2012 19:40

Ответ: следование объекта за мышью
 
Сколько таких объектов на сцене? Может быть другой в лог пишет что нельзя его взять?

Huruffus 07.08.2012 19:42

Ответ: следование объекта за мышью
 
Объект в сцене один.

pax 07.08.2012 19:47

Ответ: следование объекта за мышью
 
Я бы посмотрел на реальные координаты этих двух объектов, между которыми замеряется расстояние. Не иначе дело не чистое))

Huruffus 07.08.2012 19:53

Ответ: следование объекта за мышью
 
изначально персонаж стоит около куба.
Написало "можно". когда отошёл, написало "нельзя", когда подошёл, надпись не изменилась

если передвинуть куб, то получается наоборот:
Написало "нельзя".когда подошёл, написало "можно", когда отходишь, надпись не меняется.

pax 07.08.2012 19:57

Ответ: следование объекта за мышью
 
в консоли отожми кнопочку Collapce чтоли

Huruffus 07.08.2012 20:02

Ответ: следование объекта за мышью
 
спасибо pax! Из за этой кнопки. Скажите, она влияет на результат?

pax 07.08.2012 20:03

Ответ: следование объекта за мышью
 
нет, не влияет

Huruffus 08.08.2012 13:42

Ответ: следование объекта за мышью
 
как один объект сделать дочерним по отношению к другому из скрипта?
т.е. у меня есть куб, на котором навешен скрипт (ниже). Этот скрипт работает так: подходим к кубу, выпускаем луч из камеры, если луч столкнулся с нужным нам объектом, то объект становится на позицию кубика, который является потомком камеры.
А я хочу куб стал потомком камеры.

посмотрел вот эту страницу, но не разобрал что да как.
http://docs.unity3d.com/Documentatio...rm-parent.html

мой код:
Код:

public class takeObject : MonoBehaviour {
        public GameObject takingHands;
        public Transform originTransformTakingHands;
        public Transform myParent;
        public Ray _ray;
        public RaycastHit _hit;
       
        void Start () {
               
        }
       
        void Update () {
                Screen.lockCursor = true;
                if (Input.GetKeyUp(KeyCode.E)){
                        _ray = Camera.main.ScreenPointToRay(Input.mousePosition);
                        if (Physics.Raycast(_ray, out _hit, 5)){                                               
                                originTransformTakingHands.transform.position = transform.position;
                                transform.position = takingHands.transform.position;
                                rigidbody.isKinematic = true;

                                //if (Input.GetMouseButton(0)){
                                //        gameObject.rigidbody.AddForce();
                                //}
                        }
                }
        }
}


pax 08.08.2012 13:59

Ответ: следование объекта за мышью
 
Оно?
PHP код:

_hit.collider.transform.parent Camera.main.transform 


Huruffus 08.08.2012 16:13

Ответ: следование объекта за мышью
 
нет :) когда я добавил эту строчку в скрипт, то начинается жуткий психодел: плэйн, на котором всё стоит, становится потомком камеры, и они вместе начинают падать.

распишите пожалуйста что значит, написанная вами строчка. Что она делает?

Huruffus 08.08.2012 16:28

Ответ: следование объекта за мышью
 
разобрался. правильно работает)
Спасибо!

pax 08.08.2012 16:29

Ответ: следование объекта за мышью
 
_hit.collider.transform.parent = Camera.main.transform

попадание.колайдерПопадания.трансформПопадания.его Парент = камера;

т.е. камера становится парентом объекта, в который попали

Huruffus 09.08.2012 03:43

Ответ: следование объекта за мышью
 
объект потомок камеры. При нажатии кнопки "F", нужно чтобы объект летел с заданной силой в направлении камеры. Как это организовать?
В моём случае направление движения объекта в результате применения сил оказывается одинаковым (из за forward).

Код:

if (Input.GetKey(KeyCode.F)){
        print ("F - entered");//
        transform.parent = null;//отцепляем объект от камеры
        rigidbody.isKinematic = false;// включаем физику. Что такое "кинематик"?
                                                            gameObject.rigidbody.AddForce(Vector3.forward*5, ForceMode.Impulse);// толкаю объект с силой. На этом месте и загвоздка.
}


pax 09.08.2012 07:10

Ответ: следование объекта за мышью
 
замени Vector3.forward на Camera.main.transform.forward

IsKinematic - объект, двигаемый вручную, не физикой.

Huruffus 09.08.2012 17:33

Ответ: следование объекта за мышью
 
Вложений: 1
что обозначает эта ошибка на скрине?

pax 09.08.2012 17:35

Ответ: следование объекта за мышью
 
Добавь в конце функции return ХХХ;

Huruffus 09.08.2012 17:43

Ответ: следование объекта за мышью
 
не работает. говорит "ХХХ отсутствует в текущем контексте".
да и такого никогда не видел

pax 09.08.2012 17:45

Ответ: следование объекта за мышью
 
ну я думал догадаешься, что ХХХ надо заменить на true или false...

В твоем случае надо наверное так:
PHP код:

public bool _LockCursorByButton()
    {
        return 
Input.GetKey(KeyCode.LeftShift);
    } 


Huruffus 09.08.2012 17:57

Ответ: следование объекта за мышью
 
:) ясно, спасибо

Huruffus 09.08.2012 18:53

Ответ: следование объекта за мышью
 
получаю переменную "speed" из другого класса. нажимаю debug в monoDevelop, он не ругается. Запускаю игру нажимаю "Е" и в консоли появляется такое сообщение:
NullReferenceException: Object reference not set to an instance of an object
takeObject.Update () (at Assets/scripts/takeObject.cs:16)

весь скрипт не работает. Подскажите пожалуйста как исправить?

собственно скрипт:
Код:

using UnityEngine;
using System.Collections;

public class takeObject : MonoBehaviour {
        public GameObject takingHands;
        public Ray _ray;
        public RaycastHit _hit;
        public float speed;
       
        void Start () {
               
        }
       
        void Update () {
                speed = GetComponent<char2>().speed;  //////ОШИБОЧНАЯ СТРОЧКА
               
                if (Input.GetKeyUp(KeyCode.E)){
                        _ray = Camera.main.ScreenPointToRay(Input.mousePosition);
                        if (collider.Raycast(_ray, out _hit, 10)){                                               
                                //originTransformTakingHands.transform.position = transform.position;
                                rigidbody.isKinematic = true;
                                _hit.collider.transform.parent = Camera.main.transform;
                                transform.position = takingHands.transform.position;
                        }
                }
                if (gameObject.transform.parent != null){
                        if (Input.GetKey(KeyCode.F)){
                                        print ("F - entered");//
                                        transform.parent = null;
                                        rigidbody.isKinematic = false;
                                        gameObject.rigidbody.AddForce(Camera.main.transform.forward * speed, ForceMode.Impulse);
                                }       
                }
        }
}


pax 09.08.2012 19:55

Ответ: следование объекта за мышью
 
На этом же объекте висит компонент char2?

Huruffus 09.08.2012 20:01

Ответ: следование объекта за мышью
 
нет. Char2 - это скрипт движения персонажа. Висит на капсуле.
а takeObject - это скрипт, позволяющий подобрать предмет, на котором висит этот скрипт

pax 09.08.2012 20:06

Ответ: следование объекта за мышью
 
Так вот, ты пытаешься получить компонент Char2 с этого объекта, а не с капсулы.

Попробуй следующим образом:
PHP код:

using UnityEngine;
using System.Collections;

public class 
takeObject MonoBehaviour {
    public 
GameObject takingHands;
    public 
Ray _ray;
    public 
RaycastHit _hit;
    public 
float speed;
        private 
char2 _char2;
    
    
void Start () {
        
_char2 = (char2)FindObjectOfType(typeof(char2));
    }
    

    
void Update () {
        
speed _char2 .speed;  //////ОШИБОЧНАЯ СТРОЧКА
        
        
if (Input.GetKeyUp(KeyCode.E)){
            
_ray Camera.main.ScreenPointToRay(Input.mousePosition);
            if (
collider.Raycast(_rayout _hit10)){                        
                
//originTransformTakingHands.transform.position = transform.position;
                
rigidbody.isKinematic true;
                
_hit.collider.transform.parent Camera.main.transform;
                
transform.position takingHands.transform.position;
            }
        }
        if (
gameObject.transform.parent != null){
            if (
Input.GetKey(KeyCode.F)){
                    print (
"F - entered");//
                    
transform.parent null;
                    
rigidbody.isKinematic false;
                    
gameObject.rigidbody.AddForce(Camera.main.transform.forward speedForceMode.Impulse);
                }    
        }
    }



Huruffus 09.08.2012 21:15

Ответ: следование объекта за мышью
 
здорово! спасибо.

т.е. вы создали собственный тип переменной... дальше не понимаю

_char2 = (char2)FindObjectOfType(typeof(char2));

Объясните пожалуйста:
1. что значат скобки вокруг char2;
2. ...(typeof(char2)); что обозначает typeof?

мне понятно, что значит эта запись, но только туманно. мы ищем объект типа char2 и присваиваем его переменной _char2. Хочется конкретики по каждой из команд.

pax 09.08.2012 21:19

Ответ: следование объекта за мышью
 
1. приведение типа UnityEngine.Object (который возвращает функция FindObjectOfType) к типу char2
2. получение типа char2

Huruffus 10.08.2012 18:32

Ответ: следование объекта за мышью
 
Вложений: 1
скажите пожалуйста, почему такую ошибку выдаёт? (скрин)

Huruffus 10.08.2012 18:34

Ответ: следование объекта за мышью
 
http://youtu.be/KeCFk4bJOKA?t=10m56s

в этом туториале так написано и работает

pax 10.08.2012 19:41

Ответ: следование объекта за мышью
 
потому что Vertical

Huruffus 10.08.2012 20:27

Ответ: следование объекта за мышью
 
исправил, но ошибка так и осталась :(

pax 10.08.2012 20:29

Ответ: следование объекта за мышью
 
а, не прочитал ошибку) Вероятно был в туторе js
PHP код:

if((Input.GetAxis("Horizontal")!= 0f) && (Input.GetAxis("Vertical")!= 0f) ) 


Huruffus 12.08.2012 19:36

Ответ: следование объекта за мышью
 
Вложений: 1
Здравствуйте!
Создаю анимацию в Blender3d для камеры в Unity3d.

создал анимацию (смотрите скриншот), экспортировал в Unity, написал скрипт для проигрывания анимации при передвижении. Работает.

НО!

Камера анимирована по оси Z. Когда нажимаешь клавишу для передвижения, начинает проигрываться анимация, но становиться не возможно наклонять камеру вперёд-назад во время проигрывания анимации.

Кто-нибудь знает в чём может быть дело?

Пример покачивания камеры видел, делу не помогло (там где ходишь зимой по снегу).

Скрипт анимации:

PHP код:

using UnityEngine;
using System.Collections;

public class 
animationCamera MonoBehaviour {
    public 
AnimationClip kuch;
    
    
void Start () {
        
animation.AddClip(kuch"kuch");
    }

    
void Update () {
        if (
Input.GetKey(KeyCode.W)) {
            
Animate ();
        }
    }
    
void Animate () {        
        
animation.Play("kuch");
    }



pax 12.08.2012 22:04

Ответ: следование объекта за мышью
 
Так это, камеру дочерним объектом сделай и делай с ней что хочешь.

Huruffus 12.08.2012 22:54

Ответ: следование объекта за мышью
 
Вложений: 1
сейчас покажу иерархию

pax 12.08.2012 22:59

Ответ: следование объекта за мышью
 
Ну и в чем проблема? Удали компоненты с камеры для этого нода, поставь камеру внутрь иерархии, на ней такие же компоненты повесь для управления.

Huruffus 12.08.2012 23:29

Ответ: следование объекта за мышью
 
дак она и так самая низшая. Пустышки не имеют роли - на них нет ничего.

Камера и так дочерний по отношению к капсуле. А на капсуле кхэректер контроллер.

pax 12.08.2012 23:32

Ответ: следование объекта за мышью
 
так сделай объект дочерний к камере, сделай из этого объекта камеру

Huruffus 17.08.2012 23:02

Ответ: следование объекта за мышью
 
Спасибо pax!



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

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

Скажите пожалуйста, как это исправить?

PHP код:

using UnityEngine;
using System.Collections;

public class 
char2 MonoBehaviour {
    
//значения скоростей
    
public float speed 6.0F;
    public 
float jumpSpeed 8.0F;
    public 
float gravity;
    
    
//Значение вектора
    
private Vector3 moveDirection Vector3.zero;
    
    
void Start () {
        
renderer.enabled false;
        
        
collider.enabled true;
    }
        
    
void Update () {        
        
CharacterController controller GetComponent<CharacterController>(); //GetComponent - присваивает компонент
        
if (controller.isGrounded) {  //Поведение на земле
            
moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0Input.GetAxis("Vertical"));
            
moveDirection transform.TransformDirection(moveDirection); //TransformDirection - Преобразуем Локальные координаты в Глобальные
            
moveDirection *= speed;
            if (
Input.GetKey(KeyCode.Space))
                
moveDirection.jumpSpeed;
            
//Ускорение по нажатию кнопки LShift и замедление по отпусканию
            
if (Input.GetKey (KeyCode.LeftShift)&&(Input.GetKey(KeyCode.W)||
                                                    
Input.GetKey(KeyCode.A)||
                                                    
Input.GetKey(KeyCode.S)||
                                                    
Input.GetKey(KeyCode.D)))                
                
speed 12.0F;
            if (
Input.GetKeyUp(KeyCode.LeftShift)){
                
speed 6.0F;        
                if (
controller.isGrounded)
                    
speed 6.0F; else speed 6.0F;
            }
        }
        if (
controller.isGrounded)
                    
speed speed; else speed 6.0F;
//------------------------------------------------------
        
moveDirection.-= gravity Time.deltaTime;
        if (!
controller.isGrounded) {  //Поведение вне земли. ПРОБЛЕМЫ В ДАННОМ МЕСТЕ!!!
            
moveDirection = new Vector3(Input.GetAxis("Horizontal"), moveDirection.yInput.GetAxis("Vertical"));
            
moveDirection transform.TransformDirection(moveDirection); //TransformDirection - Преобразуем Локальные координаты в Глобальные
            
moveDirection *= speed/2;
        }
        
controller.Move (moveDirection Time.deltaTime); //controller.Move - более сложное движение. Объект скользит по мешу
        
        
controller.detectCollisions true;
    }



pax 22.08.2012 07:52

Ответ: следование объекта за мышью
 
Я бы вынес инпуты GetKey* наружу ифа.
PHP код:

if (controller.isGrounded
    
speed 6.0F; else speed 6.0F

Это условие меня повергло в шок :-D

Это:
PHP код:

if (controller.isGrounded
                    
speed speed; else speed 6.0F

можно записать как
PHP код:

if (!controller.isGroundedspeed 6.0F

ну и
PHP код:

//moveDirection.y -= gravity * Time.deltaTime;        
        
if (!controller.isGrounded) {  //Поведение вне земли. ПРОБЛЕМЫ В ДАННОМ МЕСТЕ!!! 
            
moveDirection = new Vector3(Input.GetAxis("Horizontal"), moveDirection.yInput.GetAxis("Vertical")); 
            
moveDirection transform.TransformDirection(moveDirection); //TransformDirection - Преобразуем Локальные координаты в Глобальные 
            
moveDirection *= speed/2
        }
        
moveDirection.-= gravity Time.deltaTime



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

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