RigidbodyFPSWalker + custom gravity (Решено)

Программирование на Юнити.

RigidbodyFPSWalker + custom gravity (Решено)

Сообщение antonio 13 сен 2010, 17:40

Собираю игрока с помощью модифицированного RigidbodyFPSWalker выравниваю его относительно поверхности подсмотренным в locomotion – AdjustToGravity RaycastHit-ом.
Игрок перемещается по поверхности как и требуется, но вот заставить его смотреть на мышку не получается. Точнее в редакторе все работает как надо. Но когда делаю билд игрок отказывается поворачиваться.
Если вращать игрока с клавиатуры то все нормально, но такой вариант не подходит (ниже в скрипте оставил закомментированный пример). Нужен игрок с камерой от первого лица.

Скрипт игрока:

Синтаксис:
Используется javascript
var speed = 10.0;
var gravity = 10.0;
var canJump = true;
var jumpHeight = 2.0;
private var grounded = false;

var rotationSpeed = 100.0;
var sensitivityX = 15;

private var desiredUp = Vector3.zero;
var groundLayers : LayerMask;

@script RequireComponent(Rigidbody, CapsuleCollider)

function Awake ()
{
        rigidbody.freezeRotation = true;
        rigidbody.useGravity = false;
}

function FixedUpdate ()
{      
        AdjustToGravity();

        if (grounded)
        {

                mouseX = Input.GetAxis("Mouse X")* sensitivityX;
                transform.rotation *= Quaternion.Euler(0, mouseX, 0);
               
                /*
                horizontal = Input.GetAxis("Horizontal")*rotationSpeed;
                if(horizontal != 0)
                {
                        var RotationOvertime = Quaternion.Euler(0,horizontal*5*Time.deltaTime,0);
                        transform.rotation *= RotationOvertime;
                }
                */

               
                // Calculate how fast we should be moving
                var targetVelocity = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
                targetVelocity = transform.TransformDirection(targetVelocity);
                targetVelocity *= speed;

                // Apply a force that attempts to reach our target velocity
                var velocity = rigidbody.velocity;
                var velocityChange = (targetVelocity - velocity);              

                // clamp acceleration vector to unit sphere
        if (velocityChange.sqrMagnitude > 1)
                velocityChange.Normalize();
               
                rigidbody.AddForce(velocityChange, ForceMode.VelocityChange);          
       
                // Jump
                if (canJump && Input.GetButton("Jump"))
                {
                        rigidbody.velocity = velocity + transform.up * Mathf.Sqrt(2 * jumpHeight * gravity);
                }
        }
       
        // We apply gravity manually for more tuning control
        rigidbody.AddForce(desiredUp * -gravity * rigidbody.mass);

        grounded = false;

}

function OnCollisionStay ()
{
   grounded = true;
}

function AdjustToGravity() {

        var origLayer = gameObject.layer;
        gameObject.layer = 2;  
        var currentUp = transform.up;  
        var damping = Mathf.Clamp01(Time.deltaTime*5); 
        var hit : RaycastHit;
       
        for (var i=0; i<8; i++) {
                var rayStart =
                        transform.position
                        + transform.up
                        + Quaternion.AngleAxis(360*i/8.0, transform.up)
                        * (transform.right*0.5);
                                       
                Debug.DrawRay(rayStart, transform.up * -5, Color.red);
//      Debug.Log(Physics.Raycast(rayStart, transform.up*-48, hit, 3.0, groundLayers));
                   
                if ( Physics.Raycast(rayStart, transform.up*-2, hit, 3.0, groundLayers.value)) {
                                desiredUp += hit.normal;
                        }
        }
        desiredUp = (currentUp+desiredUp).normalized;
        var newUp = (currentUp+desiredUp*damping).normalized;
       
        var angle = Vector3.Angle(currentUp,newUp);
        if (angle>0.01) {
                axis = Vector3.Cross(currentUp,newUp).normalized;
                rot = Quaternion.AngleAxis(angle,axis);
                transform.rotation = rot * transform.rotation;
        }
       
        gameObject.layer = origLayer;

}
 


Ну а здесь package если у кого руки дойдут потестить
У вас нет доступа для просмотра вложений в этом сообщении.
Последний раз редактировалось antonio 14 сен 2010, 14:44, всего редактировалось 1 раз.
Аватара пользователя
antonio
UNIт
 
Сообщения: 132
Зарегистрирован: 03 ноя 2009, 15:42
Откуда: Смоленск

Re: RigidbodyFPSWalker + custom gravity

Сообщение Faps 13 сен 2010, 20:29

в [unity 3D] бывают косяки при билденге (не все скрипты обновляются при перезаписи экзэшника), у меня тоже такая хрень была

при постройке билда я сначала сохраняю сцену, затем удаляю старый билд (экзэшник и папку с именем экзэшника), затем компилю в билд

и все нормально без косяков
Faps
UNIт
 
Сообщения: 73
Зарегистрирован: 29 май 2010, 13:21

Re: RigidbodyFPSWalker + custom gravity

Сообщение Zaicheg 13 сен 2010, 20:51

По-моему, происходит полная перезапись файлов, а не некое дополнение.
Может быть, Вы забыли сохранить сцену перед сборкой? У меня такое часто бывало.
Дьяченко Роман
e-mail: _zaicheg.reg@gmail.com
skype: zaicheg12
vkontakte: _vk.com/zaichegq
Работа: _wie3.com _www.sanviz.com
Аватара пользователя
Zaicheg
Адепт
 
Сообщения: 3024
Зарегистрирован: 19 июн 2009, 15:12
Откуда: Череповец

Re: RigidbodyFPSWalker + custom gravity

Сообщение antonio 13 сен 2010, 22:21

Спасибо большое что отозвались на проблему.
Дело в том что даже если с чистого проекта делать - первый билд происходит все то-же самое (в [unity 3D] 2.5 и 2.6).
Я думаю что дело в последовательности применения transform.rotation. Сначала выравнивание по поверхности потом вращение мышью.
Я не силен в математике скриптопостроения поэтому видимо не могу отследить где происходит ошибка. Если просто повесить MouseLook то он переписывает вращение (что стрелял что не стрелял рэйкастом) - не справился с MouseLook-ом.
Ctrl+S как и у многих на автомате (с периодичностью 10сек.)
Аватара пользователя
antonio
UNIт
 
Сообщения: 132
Зарегистрирован: 03 ноя 2009, 15:42
Откуда: Смоленск

Re: RigidbodyFPSWalker + custom gravity

Сообщение Agenda 14 сен 2010, 08:03

не стоит смешивать transform и rigidbody

transform.rotation -> rigidbody.MoveRotate или rigidbody.rotation
transform.position -> rigidbody.MovePosition или rigidbody.position
Agenda
UNец
 
Сообщения: 30
Зарегистрирован: 13 апр 2010, 07:57

Re: RigidbodyFPSWalker + custom gravity

Сообщение antonio 14 сен 2010, 14:41

Вот никак не ожидал такой подставы.
Дело в том что я работаю на двух мониках. И по привычке в одном окне редактор в другом плеер. Если перетаскиваю билд в рабочее окно в котором строил то все ок (неделю бьюсь с вращением). Как всегда драйвера переставляем вместо того чтобы мышь в порт подключить )
Agenda - спасибо избавил от будующих косяков.
Теперь спокойно буду управление дорабатывать.
Аватара пользователя
antonio
UNIт
 
Сообщения: 132
Зарегистрирован: 03 ноя 2009, 15:42
Откуда: Смоленск


Вернуться в Скрипты

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

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