Поворот персонажа джойстиком. Как?

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

Поворот персонажа джойстиком. Как?

Сообщение Rando_OM 22 дек 2015, 03:56

Извиняюсь, может уже спрашивали. Как сделать так, чтобы персонаж смотрел в сторону, куда направлен джойстик геймпада или мобилки, думаю без разницы. Для примера могу привести игру zombiуwood для телефона.
Rando_OM
UNIт
 
Сообщения: 94
Зарегистрирован: 22 дек 2015, 03:44
Откуда: Россия
Skype: gorodok402
  • Сайт

Re: Поворот персонажа джойстиком. Как?

Сообщение waruiyume 22 дек 2015, 04:27

Умножить поворот камеры на вектор направления джойстика (или на оборот, не помню)
У полученного вектора обнулить Y компонент
Нужное вращение можно получить из предыдущего вектора через Quaternion.LookRotation
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Поворот персонажа джойстиком. Как?

Сообщение Syberex 22 дек 2015, 08:26

У меня в джойстике есть пример такого управления :)
Аватара пользователя
Syberex
Адепт
 
Сообщения: 2292
Зарегистрирован: 14 янв 2011, 20:35
Откуда: Кострома
  • Сайт

Re: Поворот персонажа джойстиком. Как?

Сообщение Rando_OM 22 дек 2015, 15:00

Можно поподробней? У джойстика 2 оси, значит надо сделать Vector3, где z = 0?
Игра изометрическая, можно сказать похожа на Diablo. Камера находиться в одном положении. Пробовал переделать пример из Survival shooter, но ничего не вышло (Смотрит в одну сторону :( )
Мои игры доступны онлайн на Kongregate.com! ---->>
Rando_OM
UNIт
 
Сообщения: 94
Зарегистрирован: 22 дек 2015, 03:44
Откуда: Россия
Skype: gorodok402
  • Сайт

Re: Поворот персонажа джойстиком. Как?

Сообщение Syberex 22 дек 2015, 23:10

Приведу пример моего скрипта CharController:
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class CharController : MonoBehaviour
{       public float speed = 6.0f;
    public float jumpSpeed = 8.0f;
    public float gravity = 20.0f;
        public float angleRotation = 45f;
        public float powerShoot = 250f;
        public float delayShoot = 0.5f;
        public Object shellPrefab;
        public Transform gun;

        private float timer = 0f;
        private bool isShoot = false;
        private CharacterController chcr;
        private Vector2 deltaMove;
        private Vector2 deltaRot;


        void Start()
        {
                chcr = GetComponent<CharacterController>();
        }


.............

        public void OnMove(Vector2 delta)
        {
                deltaMove = delta;
        }


        public void OnRotate(Vector2 rot)
        {
                deltaRot = rot;
        }


        public void Shoot()
        {
                isShoot = true;
        }

 

Джойстик вызывает метод OnRotate(Vector2 rot), передает туда значения смещения по осям x и y. Сам поворот ищите в Update.
Аватара пользователя
Syberex
Адепт
 
Сообщения: 2292
Зарегистрирован: 14 янв 2011, 20:35
Откуда: Кострома
  • Сайт

Re: Поворот персонажа джойстиком. Как?

Сообщение Syberex 23 дек 2015, 00:14

Сам Update:
Синтаксис:
Используется csharp
        void Update()
        {
                timer += Time.deltaTime;
                if (isShoot && timer >= delayShoot)
                {
                        // Shoot
                        GameObject newShell = (GameObject)Instantiate(shellPrefab, gun.position + gun.forward * 1.8f, Quaternion.identity);
                        Collider colliderTank = GetComponent<Collider>();                       // Unity 5 Compatible
                        Physics.IgnoreCollision(colliderTank, newShell.GetComponent<Collider>());
                        Rigidbody rbShell = newShell.GetComponent<Rigidbody>();         // Unity 5 Compatible
                        rbShell.AddRelativeForce(gun.forward * powerShoot, ForceMode.Impulse);
                        isShoot = false;
                        timer = 0f;
                }

                // Move the character
                Vector3 moveDirection = Vector3.zero;
                if (chcr.isGrounded)
                {
                        moveDirection = new Vector3(deltaMove.x, 0f, deltaMove.y);
                        moveDirection *= speed;
                        if (Input.GetButton("Jump"))
                                moveDirection.y = jumpSpeed;

                }
                moveDirection.y -= gravity * Time.deltaTime;
                chcr.Move(moveDirection * Time.deltaTime);

                // Rotate the character (world space)
                if (Mathf.Abs(deltaRot.x) > 0.5f || Mathf.Abs(deltaRot.y) > 0.5f)
                {
                        Vector3 relativePos = new Vector3(deltaRot.x, 0f, deltaRot.y);
                        Quaternion targetRot = Quaternion.LookRotation(relativePos);
                        transform.rotation = Quaternion.Lerp(transform.rotation, targetRot, Time.deltaTime * 2f);
                }

                deltaMove = Vector2.zero;
                deltaRot = Vector2.zero;
        }
 


Скрытый текст:
При отправке сообщения происходит какой-то косяк и ни хрена не отправляется, если сообщение длиннее нескольких строк. Пробовал в разных браузерах ... У меня у одного такое???
Аватара пользователя
Syberex
Адепт
 
Сообщения: 2292
Зарегистрирован: 14 янв 2011, 20:35
Откуда: Кострома
  • Сайт

Re: Поворот персонажа джойстиком. Как?

Сообщение Rando_OM 23 дек 2015, 06:53

В вашем примере персонаж поворачивается плавно, а мне нужно чтобы резко смотрел в сторону, куда направлен джойстик. Если делать через MoveRotation, то персонаж смотрит только в 4 стороны(
Мои игры доступны онлайн на Kongregate.com! ---->>
Rando_OM
UNIт
 
Сообщения: 94
Зарегистрирован: 22 дек 2015, 03:44
Откуда: Россия
Skype: gorodok402
  • Сайт

Re: Поворот персонажа джойстиком. Как?

Сообщение Syberex 23 дек 2015, 10:36

Тогда вместо Lerp-а просто:
transform.rotation = targetRot;
Аватара пользователя
Syberex
Адепт
 
Сообщения: 2292
Зарегистрирован: 14 янв 2011, 20:35
Откуда: Кострома
  • Сайт

Re: Поворот персонажа джойстиком. Как?

Сообщение Rando_OM 23 дек 2015, 13:14

Проблема в том, что он поворачивается только в 3 стороны - вправо, влево и верхний левый угол.
Джойстик работает исправно, проверял в других играх и смотрел оси в unity. Может можно сделать через рейкаст?
Очень прошу, помогите с этой проблемой. :ympray:
Мои игры доступны онлайн на Kongregate.com! ---->>
Rando_OM
UNIт
 
Сообщения: 94
Зарегистрирован: 22 дек 2015, 03:44
Откуда: Россия
Skype: gorodok402
  • Сайт

Re: Поворот персонажа джойстиком. Как?

Сообщение Cr0c 23 дек 2015, 16:16

А если Vector3 look = Vector3.left * Joy.x + Vector3.up * Joy.y ? Вот и получится вектор с точным углом от осей джойстика.
Единичные векторы подберете сами, я не знаю организацию сцены.
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 3035
Зарегистрирован: 19 июн 2015, 13:50
Skype: cr0c81

Re: Поворот персонажа джойстиком. Как?

Сообщение Rando_OM 23 дек 2015, 19:14

Большое спасибо. Получилось. Осталось это дело сгладить, а то рывками крутиться и все)) :-bd
Мои игры доступны онлайн на Kongregate.com! ---->>
Rando_OM
UNIт
 
Сообщения: 94
Зарегистрирован: 22 дек 2015, 03:44
Откуда: Россия
Skype: gorodok402
  • Сайт

Re: Поворот персонажа джойстиком. Как?

Сообщение Cr0c 23 дек 2015, 21:42

Rando_OM писал(а):Большое спасибо. Получилось. Осталось это дело сгладить, а то рывками крутиться и все)) :-bd

Пффф... Посчитали новый вектор направления и лерпом старый к новому приводим :) не забываем про мертвую зону и нулевой вектор при отпущенном джое!
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 3035
Зарегистрирован: 19 июн 2015, 13:50
Skype: cr0c81

Re: Поворот персонажа джойстиком. Как?

Сообщение HeySleare 13 авг 2018, 10:36

А можно как-то поподробнее объяснить, а то я чего-то не понимаю)
HeySleare
UNец
 
Сообщения: 2
Зарегистрирован: 30 июл 2018, 11:15

Re: Поворот персонажа джойстиком. Как?

Сообщение HeySleare 13 авг 2018, 11:48

Вот мой код если что.



using UnityEngine;
using CnControls;
using System.Collections;

public class characterControl : MonoBehaviour {



Vector3 position;

void Start()
{

}


void FixedUpdate () {
position = new Vector3(CnInputManager.GetAxis("Horizontal"), CnInputManager.GetAxis("Vertical"), 0f);

transform.position += position*Time.deltaTime*5;

if (position.x < 0)
{
transform.rotation = Quaternion.Euler(0, 180, 0); // это старые развороты
}
if (position.x > 0)
{
transform.rotation = Quaternion.Euler(0, 0, 0);
}



}
}
Что мне сделать чтобы персонаж поворачивался с направлением двойстика?
HeySleare
UNец
 
Сообщения: 2
Зарегистрирован: 30 июл 2018, 11:15


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

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

Сейчас этот форум просматривают: Google [Bot] и гости: 15