Понедельник, 25 Ноября 2024, 15:31

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Движение космического корабля
ArtemSДата: Вторник, 13 Июня 2017, 18:11 | Сообщение # 1
почетный гость
Сейчас нет на сайте
Народ подскажите ,пожалуйста, пытался сделать управление под действием сил, чтобы скорость постепенно набиралась и убывала, а получилось что попало. Корабль начинает лететь в указанном направлении, а потом его уносит вперед какая-то сила, не могу врубиться где накосячил. Linear drag пытался менять, нечего не помогло и на 0, и на других значениях улетает!!! Если этот же код использую без AddForce то все идеально работает....

Код
using UnityEngine;
using System.Collections;

public class PlayerController : MonoBehaviour
{
    public float speedRotation = 1.2f;
    public float speed = 0.05f;
    float inputX;
    float inputY;
    Rigidbody2D rb;
    

    void Start()
    {
       rb = GetComponent<Rigidbody2D>();            
    }

    void Update()
    {

        //извлечение информации оси
        inputX = Input.GetAxis("Horizontal");//лево-право
        inputY = Input.GetAxis("Vertical");  //верх-низ

    }
   
    void FixedUpdate()
    {

        
        if (Input.GetKey(KeyCode.W))                      //вперед
            rb.AddForce(rb.transform.position += rb.transform.up * speed);

        if (Input.GetKey(KeyCode.S))                      //назад
            rb.AddForce(rb.transform.position -= rb.transform.up * speed);

        if (Input.GetKey(KeyCode.A) && Input.GetMouseButton(1))                      //влево
            rb.AddForce(rb.transform.position -= rb.transform.right * speed);

        if (Input.GetKey(KeyCode.D) && Input.GetMouseButton(1))                      //вправо
            rb.AddForce(rb.transform.position += rb.transform.right * speed);

        if (!Input.GetMouseButton(1))
        {
            Quaternion rotate = Quaternion.AngleAxis(-inputX * speedRotation, Vector3.forward);  //вращение
            rb.transform.rotation *= rotate;
        }
    }
        
       

        
}

Добавлено (13 июня 2017, 18:03)
---------------------------------------------
ыыы нашел!! нужно было убрать первое слагаемое и просто оставить знак)

Добавлено (13 июня 2017, 18:11)
---------------------------------------------
Тогда другой вопрос) как корректно сделать движение назад и поворот одновременно (на подобии движения автомобиля), при левой клавише+назад корабль летел влево. Я нашел решене, но мне кажется слишком сложно и мудрино с if оператором.. менять знак оси если одновременно S+A(D) нажаты


хуяк, хуяк и в продакшн
seamanДата: Вторник, 13 Июня 2017, 21:58 | Сообщение # 2
старожил
Сейчас нет на сайте
Да вы первооткрыватель!
Ни разу не видел чтобы в одном скрипте так смешивали физику и простое перемещение.
Что за глупость - устанавливать позицию и тут же прикладывать силу...
ArtemSДата: Среда, 14 Июня 2017, 10:54 | Сообщение # 3
почетный гость
Сейчас нет на сайте
Цитата seaman ()
Ни разу не видел чтобы в одном скрипте так смешивали физику и простое перемещение.
Что за глупость - устанавливать позицию и тут же прикладывать силу...


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


хуяк, хуяк и в продакшн
seamanДата: Среда, 14 Июня 2017, 13:03 | Сообщение # 4
старожил
Сейчас нет на сайте
Что Вы собственно исправили?
Ну а так - если у Вас уже есть inputX и inputY - не нужно снова проверять Input.GetKey. Используйте то что уже есть.
Код
Vector3 move;

void Update()
{
   inputX = Input.GetAxis("Horizontal");//лево-право
   inputY = Input.GetAxis("Vertical");  //верх-низ
   move = new Vector3(inputX, 0, inputY);
}
void FixedUpdate()
{
   rb.AddForce(move * speed);
}
ArtemSДата: Среда, 14 Июня 2017, 18:04 | Сообщение # 5
почетный гость
Сейчас нет на сайте
Цитата seaman ()
Что Вы собственно исправили?


Код
void FixedUpdate()
    {

        
        if (Input.GetKey(KeyCode.W))                      //вперед
            rb.AddForce(rb.transform.up * speed);

        if (Input.GetKey(KeyCode.S))                      //назад
            rb.AddForce(-rb.transform.up * speed);

        if (Input.GetKey(KeyCode.A) && Input.GetMouseButton(1))                      //влево
            rb.AddForce(-rb.transform.right * speed);

        if (Input.GetKey(KeyCode.D) && Input.GetMouseButton(1))                      //вправо
            rb.AddForce(rb.transform.right * speed);

        if (!Input.GetMouseButton(1))
        {
            Quaternion rotate = Quaternion.AngleAxis(-inputX * speedRotation, Vector3.forward);  //вращение
            rb.transform.rotation *= rotate;
        }
    }


а вопрос такой,как корректно сделать движение назад и поворот одновременно (на подобии движения автомобиля), при левой клавише+назад корабль летел влево? Я нашел решение, но мне кажется слишком сложно и мудрено с if оператором.. менять знак оси если одновременно S+A(D) нажаты. Собственно все эти проверки для того, чтобы можно было двигаться как стрейфом, так и просто вращаться, а если сюда еще и смену знака при движении назад добавить, то код будет ужасно выглядеть,а он и щас не блещет)


хуяк, хуяк и в продакшн
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг