Тащить объект как в half-life, amnesia (типа гравипушка)

Общие вопросы о Unity3D

Тащить объект как в half-life, amnesia (типа гравипушка)

Сообщение DDDENISSS 13 июн 2012, 21:09

Пытаюсь сделать, чтобы можно было брать/тащить объекты, захватывать и вращать вентили и тп.
Пробовал закреплять объекты к игроку всякими джоинтами, но получился бред.
Вот видео с FixedJoint http://www.youtube.com/watch?v=8Dx-3TRM ... e=youtu.be объект дергается, проходит через коллайдеры и если сунуть этот объект себе под ноги то вообще ж@па. С другими джоинтами тоже не то.
Скрипт
Синтаксис:
Используется csharp
public class Drager : MonoBehaviour {
        private Transform cameraTrans;
        private FixedJoint hand;
       
        void Awake () {
                cameraTrans = GetComponentInChildren<Camera>().transform;
               
                hand = new GameObject("Hand").AddComponent<FixedJoint>();
               
                hand.transform.parent = cameraTrans;
                hand.transform.localPosition = Vector3.forward;
                hand.transform.localRotation = Quaternion.identity;
                hand.transform.localScale = Vector3.one;
                hand.rigidbody.isKinematic = true;
        }
       
        // Update is called once per frame
        void Update () {
                if( Input.GetMouseButtonDown(0) && hand.connectedBody == null ) {
                        RaycastHit hit = Raycast();
                        if(hit.rigidbody != null) {
                                hand.connectedBody = hit.rigidbody;
                                hand.connectedBody.useGravity = false;
                        }
                }
                if(Input.GetMouseButtonUp(0) && hand.connectedBody != null) {
                        hand.connectedBody.useGravity = true;
                        hand.connectedBody = null;
                }
        }
       
        private RaycastHit Raycast() {
                Ray ray = new Ray();
                ray.origin = cameraTrans.position;
                ray.direction = cameraTrans.forward;
                RaycastHit hit = new RaycastHit();
                int layer = 1 << LayerMask.NameToLayer("Player");
                Physics.Raycast( ray, out hit, 6, ~layer );
                return hit;
        }
}
 

Тем более чтобы крутить вентиль надо хвататься за определенную точку, а не центр объекта. Можно ли такое с джоинтами сделать я не понял.
Еще не уверен хорошо ли, что CharacterController является родительским объектом для моего джоинта с его кинематическим RigidBody.
Аватара пользователя
DDDENISSS
UNIверсал
 
Сообщения: 439
Зарегистрирован: 11 сен 2011, 20:33

Re: Тащить объект как в half-life, amnesia (типа гравипушка)

Сообщение Paul Siberdt 13 июн 2012, 21:53

Тыкаешь в коллайрер объекта, получаешь точку касания и строишь в ней джоинт-родитель для объекта. :)
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт

Re: Тащить объект как в half-life, amnesia (типа гравипушка)

Сообщение DDDENISSS 13 июн 2012, 22:08

строишь в ней джоинт-родитель для объекта.

Не понял что за джоинт-родитель?
А джонить объект к чему? К пустышки удочеренной камере?
Аватара пользователя
DDDENISSS
UNIверсал
 
Сообщения: 439
Зарегистрирован: 11 сен 2011, 20:33

Re: Тащить объект как в half-life, amnesia (типа гравипушка)

Сообщение Paul Siberdt 13 июн 2012, 23:13

Создается гейм-обжект с кинетик ригидбодей в точке касания лучика (или чем там трассируется пересечение мыши с объектом) с объектом сцены.
Потом объект сцены привязывается джойтном к только что созданному. Получается - кинетический объект движется за мышью (или чем там?) и тянет джойнтом за собой физический объект сцены.
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт

Re: Тащить объект как в half-life, amnesia (типа гравипушка)

Сообщение DDDENISSS 13 июн 2012, 23:40

Вообщем-то так я и делаю. Только Кинетический объект не в точке касания, а в hand.transform.localPosition = Vector3.forward;
Ну и гравитацию я отключаю.
Вот демка.
HTML код для вашего блога :
Код: Выделить всё
<script language='javascript' type="text/javascript"> document.write("<iframe marginheight='0' src='http://unity3d.ru/distribution/player.php?url=https://dl.dropbox.com/u/55489242/Hangar/v1/WebPlayer/WebPlayer.unity3d&w=800&h=600&t=false&preview=1' height='"+(600+30)+"' width='800' frameborder='0' scrolling='no'></iframe>"); </script>
Аватара пользователя
DDDENISSS
UNIверсал
 
Сообщения: 439
Зарегистрирован: 11 сен 2011, 20:33

Re: Тащить объект как в half-life, amnesia (типа гравипушка)

Сообщение eligma 14 июн 2012, 00:27

А какой клавишей цеплять гравипушку не сказал. Я делал уже такую гравицапу на джи си может чем то поможет. viewtopic.php?f=5&t=8690 у меня еще кидает вперед предмет. Я пока делал понял что возможны разные реализации этой фичи из за свойств юнити. может зависеть от массы может не зависеть и вообще разная ерунда
Притяжение правой кнопкой - бросок левой и не забывай что в кайф лайф он может бросать вперед предметы даже не притягивая их - то есть с растояния 10 -20 метров (бросать или разбивать)
Gleeko Multiplayer Gameplay------Знаете ли вы что протокол IPV6 в 1 000 000 раз превышает по возможностям протокол IPV4? А также протокол IPV6 официально был запущен в прошлом году 6.06 числа в 6 часов утра. Это событие отмечали во всем мире.
Аватара пользователя
eligma
Старожил
 
Сообщения: 778
Зарегистрирован: 29 фев 2012, 03:35
  • Сайт

Re: Тащить объект как в half-life, amnesia (типа гравипушка)

Сообщение bomberest 14 июн 2012, 00:50

Там сделано через rigidBody.AddForce в сторону игрока, при минимальном расстоянии отключать rigidBody, цеплять любым способ к игроку, хоть ребёнком его сделай.
Основы Unity3D Свой 2D-движок Фильм для разработчиков Кастомизация едитора
Лекции игрового программирования
Skype: Andrewf56 | Steam: bomberest (-AnF-) | Vk: _https://vk.com/andrewshut
Аватара пользователя
bomberest
Старожил
 
Сообщения: 538
Зарегистрирован: 22 июн 2011, 14:38
Откуда: Минск
  • ICQ

Re: Тащить объект как в half-life, amnesia (типа гравипушка)

Сообщение DDDENISSS 15 июн 2012, 09:54

В HL на самом деле эта система не так и сложна. Предметы либо берутся, либо не берутся. Масса на это никак не влияет. Масса влияет только когда кидаешь объект.
А вот в амнезии тяжелые блоки уже тащишь, а не несешь. И хватаешь их не за центр, а за любой край, что и дает возможность открывать двери, крутить вентиля и тп.
eligma, лкм брать предметы.
Аватара пользователя
DDDENISSS
UNIверсал
 
Сообщения: 439
Зарегистрирован: 11 сен 2011, 20:33

Re: Тащить объект как в half-life, amnesia (типа гравипушка)

Сообщение eligma 15 июн 2012, 11:19

Не надо в юнити смешивать - крутить вентиля и тащить предметы. Тем более что кручение вентиля должно привести к какому то событию - иначе зачем его крутить. А значит каждый вентиль нужно прописывать отдельно И плюс ты не сможешь закрепить какой то вентиль относительно центра - это ж не сантехника
Gleeko Multiplayer Gameplay------Знаете ли вы что протокол IPV6 в 1 000 000 раз превышает по возможностям протокол IPV4? А также протокол IPV6 официально был запущен в прошлом году 6.06 числа в 6 часов утра. Это событие отмечали во всем мире.
Аватара пользователя
eligma
Старожил
 
Сообщения: 778
Зарегистрирован: 29 фев 2012, 03:35
  • Сайт

Re: Тащить объект как в half-life, amnesia (типа гравипушка)

Сообщение DDDENISSS 15 июн 2012, 14:50

Вот видео пенумбры http://www.youtube.com/watch?v=r3UJFlHf ... el&list=UL
На 1:55 ящик тянут, на 9:17 рычаг, на 9:50 из стола ящики вытягивают.
По-моему все это делается одной системой.
Аватара пользователя
DDDENISSS
UNIверсал
 
Сообщения: 439
Зарегистрирован: 11 сен 2011, 20:33

Re: Тащить объект как в half-life, amnesia (типа гравипушка)

Сообщение berserk95 15 июн 2012, 16:20

Стандартный Юнитивский скрипт ДрагРигидбоди, но введена зависимость подтяния объекта от его массы.

Синтаксис:
Используется javascript
var spring = 50.0;
var damper = 0;
var drag = 1;
var angularDrag = 0.5;
var distance = 0.5;
var attachToCenterOfMass = false;

private var springJoint : SpringJoint;

function Update ()
{
        // Make sure the user pressed the mouse down
        if (!Input.GetMouseButtonDown (0))
                return;

        var mainCamera = FindCamera();
               
        // We need to actually hit an object
        var hit : RaycastHit;
        if (!Physics.Raycast(mainCamera.ScreenPointToRay(Input.mousePosition),  hit, 10))
                return;
        // We need to hit a rigidbody that is not kinematic
        if (!hit.rigidbody || hit.rigidbody.isKinematic)
                return;
       
        if (!springJoint)
        {
                var go = new GameObject("Rigidbody dragger");
                var body : Rigidbody = go.AddComponent ("Rigidbody") as Rigidbody;
                springJoint = go.AddComponent ("SpringJoint");
                body.isKinematic = true;
        }
       
        springJoint.transform.position = hit.point;
        if (attachToCenterOfMass)
        {
                var anchor = transform.TransformDirection(hit.rigidbody.centerOfMass) + hit.rigidbody.transform.position;
                anchor = springJoint.transform.InverseTransformPoint(anchor);
                springJoint.anchor = anchor;
        }
        else
        {
                springJoint.anchor = Vector3.zero;
        }
       
        springJoint.spring = spring;
        springJoint.damper = damper;
        springJoint.maxDistance = distance;
        springJoint.connectedBody = hit.rigidbody;
       
        StartCoroutine ("DragObject", hit.distance);
}

function DragObject (distance : float)
{
        var oldDrag = springJoint.connectedBody.drag;
        var oldAngularDrag = springJoint.connectedBody.angularDrag;
        springJoint.connectedBody.drag = drag;
        springJoint.connectedBody.angularDrag = angularDrag;
        var mainCamera = FindCamera();
        while (Input.GetMouseButton (0))
        {
                var ray = mainCamera.ScreenPointToRay (Input.mousePosition);
                springJoint.transform.position = ray.GetPoint(distance);
                yield;
        }
        if (springJoint.connectedBody)
        {
                springJoint.connectedBody.drag = oldDrag;
                springJoint.connectedBody.angularDrag = oldAngularDrag;
                springJoint.connectedBody = null;
        }
}

function FindCamera ()
{
        if (camera)
                return camera;
        else
                return Camera.main;
}


Не надо в юнити смешивать - крутить вентиля и тащить предметы. Тем более что кручение вентиля должно привести к какому то событию - иначе зачем его крутить. А значит каждый вентиль нужно прописывать отдельно И плюс ты не сможешь закрепить какой то вентиль относительно центра - это ж не сантехника

С чего это? Возьми куб. Повесь на него hidge joint. Ось поставь в середине. Дай ему возможность крутиться как пропеллер. И двигай скриптом.
Вот только в Амнезии (в пенумбре в том числе) когда двигаешь вентиль, рычаг - камера замораживается. Так удобнее становится, вентиль из поля зеня не пропадает. Надо что-то подобное тоже сделать ))
P.S: и к тому же чем тяжелее предмет - тем медленнее идет перс, это тоже нужно взять на заметку )
berserk95
UNITрон
 
Сообщения: 278
Зарегистрирован: 21 ноя 2011, 08:18
Откуда: Удомля, Тверская обл.
  • Сайт

Re: Тащить объект как в half-life, amnesia (типа гравипушка)

Сообщение DDDENISSS 15 июн 2012, 17:41

Я пробовал держать объекты этим hinge joint, но они начинали почему-то вращаться вокруг Character'а.
когда двигаешь вентиль, рычаг - камера замораживается. Так удобнее становится, вентиль из поля зеня не пропадает.
Не думаю, что вентиль пропадет из поля зрения, но это пока не очень важно.
и к тому же чем тяжелее предмет - тем медленнее идет перс, это тоже нужно взять на заметку

Да, надо в CharacterMotor добавить speedScale, тогда и по шифту можно будет и ускоряться и медленно тянуть тяжелые предметы.
Аватара пользователя
DDDENISSS
UNIверсал
 
Сообщения: 439
Зарегистрирован: 11 сен 2011, 20:33

Re: Тащить объект как в half-life, amnesia (типа гравипушка)

Сообщение kozhin2012 19 июн 2012, 19:00

Аватара пользователя
kozhin2012
UNец
 
Сообщения: 25
Зарегистрирован: 11 янв 2012, 18:30

Re: Тащить объект как в half-life, amnesia (типа гравипушка)

Сообщение eligma 19 июн 2012, 19:13

ну французы и ролики делают. можно без перевода все понять. все до запятой буквально рассасывают
Gleeko Multiplayer Gameplay------Знаете ли вы что протокол IPV6 в 1 000 000 раз превышает по возможностям протокол IPV4? А также протокол IPV6 официально был запущен в прошлом году 6.06 числа в 6 часов утра. Это событие отмечали во всем мире.
Аватара пользователя
eligma
Старожил
 
Сообщения: 778
Зарегистрирован: 29 фев 2012, 03:35
  • Сайт


Вернуться в Общие вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12