Войти
ПрограммированиеФорумФизика

Проблема с прыжком персонажа в Unity. (5 стр)

Страницы: 1 2 3 4 5
#60
21:49, 8 июля 2018

Пока еще не проверял


#61
23:08, 8 июля 2018

НЕБОЛЬШОЙ УРОК ПО ПЕРСОНАЖНОМУ МАНИПУЛИРОВАНИЮ UNITY-ENGINE


Ситуация1 Коллайдер

Изображение

1 Субъект слева окруженный контуром —- нужный объект . Остальные — статисты для сравнивая результатов.
Левый является эталоном ,от которого потом позже возможно делать копии и модификаты типа Prefabs . Классический пример — толпа бежит в одну сторону.

2 Контур вокруг (мужика) это зона коллайдера Capsule Collider.

Настройки Capsule Collider.

Center— центр капсул-коллайдера, позиция local-objects . Это локальная позиция объекта , не глобальная позиция.
  если х=0.2 это значит что центр смещен по оси икс на 0.2единицы относительно начала объекта , а не относительно начала координат мира (0,0,0)

Radius - радиус коллайдера .  типа ширина по линейному размеру. меряется локально по объекту , не по глобал-координатам.

Hieght - высота оболочки коллайдера . меряется локально по объекту , не по глобал-координатам.

Direction - пространство координатной системы , XYZ-Axis


Пример по кадру .

Если начало координаты локального объекта (мужика) (0, 0, 0)—это в ногах на уровне земли
то
Center = 0 , 0 , 0 координаты коллайдера совмещены с ногами .
Radius=0.55 радиус выбирается так чтоб зона коллайдера покрывала объект полностью. Объект Man (мужик) находится как бы внутри сферы . Радиус этой сферы это и есть радиус коллайдера
Hieght=3.2  высота коллайдера . подобрано так чтобы высота покрывала объект . Можно видеть что верхняя грань коллайдера накрывает голову —объект полностью скрыт в коллайдере.
Direction= Y-axis по умолчанию глобал установки.


Ситуация 2 Манипулятор Character Controller

Изображение


Важная заметка .

Character Controller и Коллайдеры связаны между собой в некоторой доле взаимодействия.
Character Controller оказывает влияние на Коллайдер.
То есть Коллайдер подчиняется контроллеру в некоторой степени .

Характеристики Контроллера

Slope Limit
  Ограничивает коллайдер только для подъема склонов, которые являются менее крутыми (в градусах), чем указанное значение.
  меряется в градусах.

Step Offset
  Тело  будет производить движение только в том случае, если это тело ближе к земле, чем указанное значение. Это не должно превышать hieght контроллера или сгенерирует ошибку.

Skin width
Ширина скина.
  Два коллайдера могут проникать друг в друга так же глубоко, как их Skin width. Большие величины Skin width  уменьшают разбрасывания в значениях. Низкая величина может привести к тому, что персонаж застрянет. Хорошая настройка - сделать это значение 10% от радиуса.


Min Move Distance
Если тело пытается двигаться при дистанциях ниже указанного значения, оно не будет двигаться вообще. Это можно использовать для уменьшения разброса в значениях. В большинстве ситуаций это значение должно оставаться на уровне 0.

Center  Это будет смещать коллайдер в глобал координатах и не повлияет на то как сменится Character-pivot опорная точка объекта
Radius  Длина капсул-коллайдера . Обычно это ширина по размеру .
    этот радиус влияет на коллайдер .этот радиус равен радиусу коллайдера
Height  Высота Capsule Collider height.  Изменение этого значения будет масштабировать коллайдер по высоте (ось игрек) сразу в две стороны : и в положительную сторону и в отрицательную.
    Если изменений никаких не нужно , то ставить значения типа 1.00001 (масштаб изменяется на тысячные доли ,то есть практически не меняется)
 
пример
высота коллайдера=1
высота Character Controller hieght=1.2 и тогда коллайдер растянется по высоте сразу и вверх и вниз в 1.2раз больше
  то есть вверху добавится 1.2хнорма , и внизу удлинится также на 1.2хнорма , враз сразу и вверх и вниз масштаб коллайдера.
   

По представленной ситуации в кадре

  Slope Limit=90 градусов
Step Offset=0.00001
Skin width=0.008
Min Move Distance =0.001
Center =.........у=-2.83 смещаем коллайдер на -2.83 по высоте чтобы выровнять уровень ног(опора объекта) с уровнем земли Terrain . на кадре видится что ногами стоит на земле (надо подбирать уровень объета под уровень земли-опоры)
Radius=0.55  как размер у коллайдера
Height=1.1 , у коллайдера масштаб увеличится на 0.1доля (на 10процентов) по высоте в обе стороны вверх и вниз.


В результате левый эталон-объект стоит ногами на опоре(земле), то есть позиции тел выровнены , Character Controller и Capsule Collider приведены в соответствие , и далее возможно проводить последующую работу с программированием объектов и прочим воздействием движка.
Три знака после запятой имеют значения в дробных числах.
То есть например 1.56 и 1.568 уже будет различаться в известной степени , хотя казалось бы 1.56 и 1.56 вполне себе равные одинако значения.

=================
НЕСОБСТВЕННАЯ ЧАСТЬ

Скрипт-программка прыжка
Script-Name: MEJump
язык программирования : си-шарп
среда исполнения : Mono-Behavior инструмент-компилятор си-шарп unity-engine


Сам скрипт:
using UnityEngine;
using System.Collections;

[RequireComponent(typeof(Rigidbody))]
public class MEJump : MonoBehaviour
{
    public GameObject mainEnemy;
    public Rigidbody Rigidbody;
    public int speed = 500;
    public int JumpSpeed = 800;
    public bool Jump;
    public GameObject Terrain;

    void Start()
    {
        mainEnemy = (GameObject)this.gameObject;
        Rigidbody = (Rigidbody)this.GetComponent<Rigidbody>();
    }
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            if (Jump == false)
            {
                Jump = true;
                Rigidbody.AddForce(mainEnemy.transform.up * JumpSpeed, ForceMode.Impulse);
            }
        }
    }
    void OnCollisionEnter(Collision collis)
    {
        if (collis.gameObject == Terrain)
        {
            Jump = false;
        }
    }
}

Скрипт вешается на объект который прыгает (в конкретном этом примере мужик в очках)
800- скорость подъема прыгающего вверх , если 800 слишком стремительно то попробуйте для типа "человек-подобный" значения 8...35

Main Enemy : это прыгающий объект (здесь это мужик)
RigidBody: это физическое-тело rigidbody
        объект который прыгает (здесь это тот же самый мужик опять)
Terrain : это земля-опора

#62
11:49, 9 июля 2018

Прыжок по анализу "земля ли это" крайне плохой. На мой взгляд, практичнее использовать маленький луч, который будет определять касание

if (Input.GetKeyDown(KeyCode.Space) && IsGrounded())
{
      if (body.velocity.y < 2)
      body.AddForce(Vector3.up * JumpForce * 20 * Time.deltaTime, ForceMode.Impulse);
}

public bool IsGrounded()
    {
        return Physics.Raycast(transform.position, -Vector3.up,  0.2f);
    }

#63
15:43, 9 июля 2018

Я оставил Character Controller. Можно ли использовать AddForce к CC? И еще тут одна возникла проблема, по которой инфы нигде нету. "Socket: unable to join multicast group, error: Получен недопустимый аргумент." Проверял и английские инет, там пишут, что проблемы с подключением и прочим, но не пишут как решить. Хотя подключение у меня нормальное.

#64
14:56, 10 июля 2018

Вроде как капсула CharacterController (эта сфера с радиусом вокруг центра CharacterController) отталкивает от себя капсулу CapsuleCollider (радиус CapsuleCollider) по направлениям высоты вверх и вниз , это зависит от взаимных расстояний hieght+radius .

#65
12:42, 11 июля 2018

Изображение

пример из книги си-шарп , программирование для unity,

строка 04 написана  с опечаткой?

должно быть наверное : public class MyCharacter : MonoBehaviour ?

#66
22:19, 13 июля 2018

Изображение

Ранее упоминалось , что
  тело прыгает один раз и потом не прыгает .
Это действительно так.

Это зависит от выравнивания уровней высот тела и опоры-земли .См отчерченая линия по уровню земли-опоры.
Если например тело на опоре-земле "стоит точно ногами по уровню"—-то прыжки будут многократные .
Если тело стоит например "погруженное вглубь на одну треть " (то есть не точно "стоит  ногами на опоре")—- то прыжок будет одноразовый.
Необходимо точно выравнивать уровни высот , чтобы тело основанием-ногами точно явно вставало на поверхность опоры-земли.

Страницы: 1 2 3 4 5
ПрограммированиеФорумФизика

Тема в архиве.