Помогите с контролером персонажа

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

Помогите с контролером персонажа

Сообщение Zhirnitoni 21 фев 2012, 20:21

Ну, в общем, я лёгких путей не ищу =) В программировании шарю очень плохо, простейшие скрипты идут очень туго. Одним словом в скриптинге я дно. Копание в Player Controller из стандартных ассетов ничего не дало, так что для общего понимания и повышения навыка я решил сделать контроллер для персонажа вручную, сам. Прекрасно понимаю, что задача очень сложная, точнее долгая, но меня это не останавливает. Вот мой многострадальный код... ПРЕДУПРЕЖДАЮ, могут быть грубые ошибки в синтаксисе и.т.д., так что если для вас это вообще полный бред, то не судите строго =)



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

       

public class PlayerMovement : MonoBehaviour
{
        public float maxForwardSpeed = 2;
        public float maxBackWardSpeed = 2;
        public float maxRaightSpeed = 2;
        public float maxLeftSpeed = 2;
        public float JumpHeight = 5;
        public float jumpSpeed = 0.0F;
        public float JumpTime = 2;
        public float speed = 0.0F;
    public float maxSpeed = 2;
        float count = 0;

       
       
        // Use this for initialization
        void Start () {
        }

        // Update is called once per frame
        void Update ()
        {
                //Char Walking
                if( Input.GetKey(KeyCode.W))
                { transform.position += Vector3.forward * Time.deltaTime * maxForwardSpeed; }
                if( Input.GetKey(KeyCode.S))
                { transform.position -= Vector3.forward * Time.deltaTime * maxBackWardSpeed; }
                if( Input.GetKey(KeyCode.A))
                { transform.position -= Vector3.right * Time.deltaTime * maxLeftSpeed; }
                if( Input.GetKey(KeyCode.D))
                { transform.position += Vector3.right * Time.deltaTime * maxRaightSpeed; }
                //Char jumping
                if (Input.GetKeyDown(KeyCode.Space))
                {
                        jumpUp();
                }
        }
               
        public IEnumerator timer()
        {
             yield return new WaitForSeconds(1);
        }
               
       
        public void jumpUp() //Going up
        {
          for (; count <= JumpHeight; count++)
                {
                        transform.position += Vector3.up * Time.deltaTime;
                }
                goDown();
        }
       
        public void goDown() //Going down
        {
                timer();
                for (; count >= 0; count--)
                {
                  transform.position -= Vector3.up * Time.deltaTime;
                }
        }
}
 


Я тут пытался реализовать простое перемещение с WASD, и прыжки. С перемещением вроде пока справился, а вот прыжки никак не поддаются. Пытался сделать цикл, чтобы поднимал на 1 вверх заданное количество раз, и запоминал сколько раз цикл выполнился, а потом столько же раз на 1 вниз. Ну и небольшую задержку вверху хотел сделать =) Конечно, ничего из этого не получилось, но уж больно интересно, как это должно работать правильно. Подскажите, поправьте, помогите. Заранее спасибо =)
Аватара пользователя
Zhirnitoni
UNец
 
Сообщения: 13
Зарегистрирован: 01 фев 2012, 20:54

Re: Помогите с контролером персонажа

Сообщение seaman 21 фев 2012, 20:44

Ну, сделать можно, конечно, разными способами. Писать длиннющие уроки на форуме я не буду. Если хотите - почитайте блог в подписи.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Помогите с контролером персонажа

Сообщение Vismar 21 фев 2012, 21:18

Целые уроки и правда не стоит расписывать тут.гляньте у seaman`a в подписи уроки,очень хорошие.Но надо иметь знания в кодинге,чтобы разобраться =)
А вообще,если хотите быть сами с усами,то обратите внимание на rigidbody и characterCоntroller.И там и там есть методы передвижения объекта,которым можно пользоваться(даже скорее нужно).
Аватара пользователя
Vismar
UNIт
 
Сообщения: 107
Зарегистрирован: 21 янв 2012, 11:20

Re: Помогите с контролером персонажа

Сообщение Berenold 22 фев 2012, 12:21

Посмотри по форуме, в скриптинге если я не ошибаюсь поднимался этот вопрос, есть уроки и даже видео уроки по C#(раз уж кодить пытаешься на нем). И рой справку в сторону characterCоntroller-а. Просто без базовых знаний самого языка, ты в жизни не разберешься в скриптах. Когда я начинал, я просто на месяц забил вообще на Unity, установил Visual Studio и разгребался с самим языком(до этого имел дело только с бейсиком, паскалем и PHP). А дальше когда азы освоишь - справка и поиск по форуму))
Невозможное возможно!
Аватара пользователя
Berenold
UNITрон
 
Сообщения: 151
Зарегистрирован: 31 июл 2010, 01:44
Откуда: Киев
  • Сайт

Re: Помогите с контролером персонажа

Сообщение AndreyMust19 22 фев 2012, 13:14

С перемещением вроде пока справился

Осталось учитывать ориентацию персонажа и добавить ускорение/торможение.

а вот прыжки никак не поддаются

Сначала определитесь с гравитацией. Она в любом случае потребуется когда персонаж должен падать. Если исп-те Caplsule Collider и Rigidbody, надо просто поставить галочку Gravity у последнего. Если CharacterController, придется писать гравитацию самостоятельно. Вам достаточно 2 формулы из баллистики:
V(t) = V0 + a*t
S(t) = V*t + (a*t^2) / 2


здесь V0 - начальная скорость, V - текущая скорость, а - ускорение тела (в данном случае a = g = 9,8 м/с^2), S - пройденное расстояние. Вместо V0 - скорость в пред. кадре, t - Time.deltaTime.

Для простых прыжков достаточно воспользоваться гравитацией. Если исп-те Rigidody, то для прыжка придаете телу вертикальную скорость V:

Синтаксис:
Используется csharp
const float jump_speed = 3.0f;
Vector3 vert = new Vector3(0.0f,3.0f,0.0f);
rigidbody.AddForce(vert, ForceMode.VelocityChange);

Если исп-те Character Controller, просто прибавляете V к текущей скорости до применения гравитации:
Синтаксис:
Используется csharp
private float v;

Update() {
...
const float jump_speed = 3.0f;
v += jump_speed;
...
// гравитация
 

}
Нужна помощь? Сами, сами, сами, сами, сами... делаем все сами
AndreyMust19
Адепт
 
Сообщения: 1119
Зарегистрирован: 07 июн 2011, 13:19

Re: Помогите с контролером персонажа

Сообщение Berenold 22 фев 2012, 14:33

AndreyMust19 писал(а):Если CharacterController, придется писать гравитацию самостоятельно. Вам достаточно 2 формулы из баллистики:
V(t) = V0 + a*t
S(t) = V*t + (a*t^2) / 2

OMG.... Уважаемый вы справку то хоть открывали??? :-? Давайте еще будем учитывать поворот земли вокруг собственной оси!
Невозможное возможно!
Аватара пользователя
Berenold
UNITрон
 
Сообщения: 151
Зарегистрирован: 31 июл 2010, 01:44
Откуда: Киев
  • Сайт

Re: Помогите с контролером персонажа

Сообщение artk 22 фев 2012, 16:24

И зачем вам понадобилось это писать? Для опыта - это бред. Копания в стандартном коде - что там не понравилось? Писать надо для конкретной задачи, а на ваш контроллер потом не получиться вставить физику. Может уже надо искать легкие пути?
PS Character Motor - действительно хреновый, поищите старый код FPSWalker в версии 2.* .
Аватара пользователя
artk
Старожил
 
Сообщения: 749
Зарегистрирован: 22 май 2011, 12:22

Re: Помогите с контролером персонажа

Сообщение AndreyMust19 22 фев 2012, 17:48

Можно написать и так. Только вот как вы найдете скорость, к-й должно обладать тело, чтобы подпрыгнуть на точную высоту (скажем 0,5 метра)?
Синтаксис:
Используется csharp
moveDirection.y -= gravity * Time.deltaTime;

Это и есть первая формула: V(t) = V0 + a*t
Нужна помощь? Сами, сами, сами, сами, сами... делаем все сами
AndreyMust19
Адепт
 
Сообщения: 1119
Зарегистрирован: 07 июн 2011, 13:19

Re: Помогите с контролером персонажа

Сообщение Berenold 23 фев 2012, 01:09

Ребята Zhirnitoni, который создал эту тему, даже языка программирования не знает. Пусть сначала разберет язык. Потом пусть разберет стандартные, уже готовые решения, а уже потом будет писать свои классы, свои контролеры и т.д. А так получается, вы пытаетесь заставить пробежать полосу препятствия ребенка, который еще и на ногах то толком не стоит. Я согласен, что CharacterController.Move мягко говоря не идеален. Но он есть, а утверждать:
AndreyMust19 писал(а):Если CharacterController, придется писать гравитацию самостоятельно.

это не так. Есть готовый инструмент, а Zhirnitoni бы искренне считал что его НЕТ!
Невозможное возможно!
Аватара пользователя
Berenold
UNITрон
 
Сообщения: 151
Зарегистрирован: 31 июл 2010, 01:44
Откуда: Киев
  • Сайт

Re: Помогите с контролером персонажа

Сообщение AndreyMust19 24 фев 2012, 15:45

Berenold
это не так. Есть готовый инструмент

Расскажите тогда про него. А то я так и делаю как описал выше.
Нужна помощь? Сами, сами, сами, сами, сами... делаем все сами
AndreyMust19
Адепт
 
Сообщения: 1119
Зарегистрирован: 07 июн 2011, 13:19


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

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

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