Управление в стиле Descent

Лучший способ помочь другим, поделиться своими находками.

Управление в стиле Descent

Сообщение echo 13 окт 2012, 13:19

Управление в полётё в стиле Descent на С#, основанное на физике.

Кораблик немного непослушный, кого это не устраивает может дописать под себя, скрипт не очень сложный.

Не забудьте добавить в Input axis-ы управления "Pitch", "Roll", "Yaw" u "Up". "Pitch" это Y-axis (mouse movement), "Yaw" это X-axis (mouse movement), "Roll" u "Up" x-axis (key or mouse button - сюда назначаем кнопки).
Затем кидаем скрипт на камеру (или куда хотите) и назначаем объекту ригидбоди и коллайдер. Всё.

Не забудьте запереть вращение (freez rotation) на ригидбоди, иначе кораблик будет жутко мотать туда сюда при столкновении с любой стенкой.

СurrentSpeed это наша текущая скорость, на её основе можно сделать повреждения, если надо.

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/67544955/DescentStyle/DescentStyle/WebPlayer/WebPlayer.unity3d&w=640&h=480&t=true&preview=1' height='"+(480+30)+"' width='640' frameborder='0' scrolling='no'></iframe>"); </script>


Ах да, ещё:
space вверх
cntrl вниз

Синтаксис:
Используется csharp
using UnityEngine;
using UnityEngine;
using System.Collections;

public class Test : MonoBehaviour {

     public Transform moving;
     
     public float maxspeed = 10.0f;
     public float force = 15f;  
     public float currentSpeed;      //наша текущая скорость, на её основе можно сделать повреждения

     // Вращение
     public float smoothRotation = 5f;      
     
     public bool lockedConst;                // If this is checked, it locks pitch roll and yaw const to the var rotationConst.
     public int rotationConst = 10;
     public float pitchConst = 1000f;
     public float rollConst = 100f;
     public float yawConst = 1000f;
     public float pitchDelta = 12f;
     public float rollDelta = 12f;
     public float yawDelta = 12f;

     private float trueSmooth;
     private float truePitch;
     private float trueRoll;
     private float trueYaw;  


     private float bankingAngle;
     private float mouseX;
     private float mouseY;
     
     public bool water = false;

     
     void Start(){
       
//              GetComponent<CharacterController>().enabled = false;
             
     if (lockedConst == true)
             {
             pitchConst = rotationConst;
             rollConst = rotationConst;
             yawConst = rotationConst;
             Screen.showCursor = false;
             }              
     }
       
        public void Awake(){
       
        }

     public void Update () {
             
             // * * This section of code handles the plane's rotation.
             var pitch = -Input.GetAxis ("Pitch") * pitchConst;
             var roll = Input.GetAxis ("Roll") * rollConst;
             var yaw = -Input.GetAxis ("Yaw") * yawConst;
     
             pitch *= pitchDelta * Time.deltaTime;
             roll *= -rollDelta * Time.deltaTime;
             yaw *= yawDelta * Time.deltaTime;
             
             // Smothing Rotations...
             trueSmooth = Mathf.Lerp (trueSmooth, smoothRotation, 5* Time.deltaTime);
             truePitch = Mathf.Lerp (truePitch, pitch, trueSmooth * Time.deltaTime);
             trueRoll = Mathf.Lerp (trueRoll, roll, trueSmooth * Time.deltaTime);
             trueYaw = Mathf.Lerp (trueYaw, yaw, trueSmooth * Time.deltaTime);      
             
             if(water){
                     Vector3 temp = moving.transform.position;
                     temp.y = moving.transform.position.y + 0.001f;
                     moving.transform.position = temp;
             }
     }
     
     public float horizontal
     {
             get
             {
                     return Input.GetAxis("Horizontal") * force;
             }
     }
     public float vertical
     {
             get
             {
                     return Input.GetAxis("Vertical") * force;
             }
     }
             
             public float Up
     {
             get
             {
                     return Input.GetAxis("Up") * force;
             }
     }

         // Now we apply what we calculated...  
         
        void FixedUpdate () {
               
                currentSpeed = rigidbody.velocity.magnitude;           
               
                rigidbody.AddForce (transform.rotation * Vector3.forward * vertical);
                rigidbody.AddForce (transform.rotation * Vector3.right * horizontal);
                rigidbody.AddForce (transform.rotation * Vector3.up * Up);
               
                transform.Rotate (truePitch,-trueYaw,trueRoll);
               
                if(currentSpeed > maxspeed)
                        rigidbody.velocity = rigidbody.velocity.normalized * maxspeed;
        }
         
}
}


P.S. Пока что кораблик может разгоняться до бесконечности, ещё не придумал как это исправить. >>> !Разобрался! Обновил скрипт
У вас нет доступа для просмотра вложений в этом сообщении.
Последний раз редактировалось echo 13 окт 2012, 21:57, всего редактировалось 1 раз.
_ttp://zero0.16mb.com/Core/
_ttp://www.indiedb.com/games/zer0
Аватара пользователя
echo
UNIт
 
Сообщения: 140
Зарегистрирован: 30 окт 2011, 17:27
Откуда: От верблюда
  • Сайт

Re: Управление в стиле Descent

Сообщение echo 13 окт 2012, 21:53

Поскольку осознал, что не все понимают о чём я тут говорю, добавил вебдемку и юнитипакадж.

Преимущества контроллера построенного на физике таковы:

Во первых он может спокойно контактировать с другими физическими объектами
Во вторых когда он упрётся в препятствие он не будет дёргаться как старая шлюха с бодуна (как все остальные подобные контроллеры летающих средств, которые я видел))
_ttp://zero0.16mb.com/Core/
_ttp://www.indiedb.com/games/zer0
Аватара пользователя
echo
UNIт
 
Сообщения: 140
Зарегистрирован: 30 окт 2011, 17:27
Откуда: От верблюда
  • Сайт

Re: Управление в стиле Descent

Сообщение dzikar 15 июн 2015, 00:58

Хех, день искал скрипт похожий и только нашёл. Бедаа. В общем сижу теперь переделываю. :(
Аватара пользователя
dzikar
UNIт
 
Сообщения: 50
Зарегистрирован: 03 сен 2014, 16:30


Вернуться в Исходники (Копилка)

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

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