Character controller isgrounded не работает

Fix багов движения, реализованного в CharacterController

Всем доброго времени суток! У меня такой вопрос: есть Unity, есть Character Controller, есть вот такой вот скрипт для прыжка:

, и такой для движения мышкой:

, так как без нее поворот работает нормально.

2)Прыжок. Здесь, вероятно, дело все-таки в Юнити, в Character Controller: Когда нажимаешь пробел, все нормально, но если его зажать, то персонаж начинает распрыгиваться. Сначала он прыгает низко, потом быстрее, и так пока наконец не прыгнет так, что пролетает всю комнату и застревает в потолке. Хелп ми, плиз, я сам не нашел, что с этим делать.

P.s.: Gravity / 10000 вызвано * Time.deltaTime в Jump, Иначе приходится в инспекторе выставлять маленькие значения для гравитации, а Sensitivity * 650 вызвано опять же * Time.deltaTime, так как приходится выставлять слишком большие значения для Sensitivity

Помощь в написании контрольных, курсовых и дипломных работ здесь.

StringGrid. fix и не fix cells одного col
Здравствуйте, гуглил/пробовал разобраться, но пока так и не разобрался. Можно ли в stringgrid.

CharacterController.cs
пытаюсь разобраться в Unity, помогите пожалуйста проблемой: Скачал скрипт отсюда.

CharacterController на движущейся платформе
Добрый день! Подскажите, пожалуйста, как сделать так, что бы CharacterController мог стоять и.

Как двигать charactercontroller по радиусу?
Здравствуйте, проблема такая, есть радиус, есть character controller необходимо двигать контроллер.

Дельтатайм там не нужен, это одноразовое действие, прибавлять тоже не надо, нужно константное значение.
Про поворот:
Твои повороты, что камеры, что перса, всегда одинаковые тк ни Char, ни Cam не меняются нигде.

Источник

Не срабатывает функция isGrounded

Не срабатывает функция isGrounded, не факт, что проблема в скрипте, но если есть какие то догадки, то буду благодарен, если расскажете.

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Не работает IsGrounded с Rigidbody в 3D игре
Решил перейти с CharacterContoroller на Rigidbody и столкнулся с проблемой. Проверку на луч.

Не срабатывает функция
Есть несложный функция function changeAttribute() < var.

не срабатывает функция
почему-то не срабатывает, не могу понять в чем дело #include «stdafx.h» #include «iostream».

Не срабатывает функция
Здравствуйте! Есть такая страница: 10

Не по теме вопроса:
1. Вы в Update постоянно обновляете текст во всех текстовых полях, а это совершенно не нужно и лишний раз нагружает игру. Обновляйте текст только тогда, когда он изменился, например нажали кнопку, сработал if, в этом же if-е и обновите текст.

2. Проверки в if с одним знаком &
if (Input.GetKeyDown(KeyCode.C) & ManaBottle1 > 0f & Mana && , чтобы условное выражение сразу возвращало false, как только обнаружено хоть одно несоответствие, то-есть

О чем и говорю что не выводит

Добавлено через 55 секунд
Тег или слой должен быть определенный, или не влияет?

У Вас откуда запускается? Кнопка на сцене?

Вы считаете меня экстрасенсом?

Что, блин, значит вероятнее всего? Код без условия не работает или работает?

DixonR, если Вам помощь не нужна, зачем Вы тему создали?

не срабатывает функция
Приветствую всех. Есть функция : function change()< var x = document.getElementById('block');.

Не срабатывает функция
Доброго времени суток. Пытаюсь написать функцию, которая выводила бы кол-во записей в БД, но.

Почему не срабатывает функция
у меня в одном файле на удаление много много функция.. одна из них должна удалять собщения функция.

Не всегда срабатывает функция
Добрый день. есть пару сайтов, для которых подключен один JS, на каждом сайте есть кнопка «Вверх».

Не срабатывает функция ajaxSend()
Привет! У меня не срабатывает функция ajaxSend() вот код. .

Почему не срабатывает функция .next()?
Всем привет, помогите понять, чего не срабатывает жКверивская функция .next() window.setPercents.

Источник

Character controller и прыжок с застреванием

У меня такой вопросец.

Создаю 3d игру, пишу управление персонажем, тестирую. И при тесте заметил баг character controller’а: когда начинаешь прыгать, идя в стену (если стена не высокая, но и не низкая, чтобы на нее можно было забраться с прыжка), в один момент персонаж резко меняет координаты (иногда застревает), что прямо очень заметно вот на этой гифке.
https://gifyu.com/image/aoi5

Еще при высоте прыжка 1.6, персонаж спокойно запрыгивает на 2хметровую стену, что тоже хотелось бы пофиксить (не уменьшением высоты прыжка).
https://gifyu.com/image/aojP

Вот так происходит обычный прыжок на 2 метра.
https://gifyu.com/image/ao0x
Нижний край персонажа достигает высоты в 2.

Движение происходит через CharacterController.Move(), прыжок работает через смену гравитации на отрицательную.

Если у вас есть способы решить сие проблемы, подскажите, пожалуйста.

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Character controller
Смотрите видео https://youtu.be/s3X4SjLxiP8 Скрипт: using UnityEngine; using.

Character Controller
Всем привет, это может, конечно, звучать тупо, но почему скорость моего персонаже, как у черепахи.

Изменение Character Controller
Здравствуйте! Начал работать в Unity и по этому использую префаб «FPSController». На нём стоит.

Character controller
Скажите, пожалуйста, как сделать, чтобы функция Move в CharacterController двигала объект в.

Я, возможно, неправильно сказал, реализация вполне себе обычная.
Жмешь пробел; персонаж смещается на вектор вверх, умноженный на силу * Time.deltaTime), после чего из силы каждый кадр вычитаем гравитацию * Time.deltaTime.

Ну да, я тупанул, не гравитацию, а силу тяжести меняем.

Можете проверить сами простейшим кодом.

Понятно. Ты свою микро физику прописываешь, только непонятно зачем, тебе не нравится rigidBody? У тебя некорректно происходит коллизия со стеной скорее всего. Тут логировать надо те или иные значения, так мысленно не поймешь. Обычная ситуация, что isGround при встрече со стеной ведет себя неадекватно(это как вариант). Посоветую тебе посмотреть как сами юнитеки реализовывали прыжок: https://docs.unity3d.com/Scrip. 1613815718

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

Мне не нужен полноценный rigidBody для rpg игры. Гравитация и прыжок — все, что нужно. Это все равно, что делать переменную «количество» типом float вместо int (слабое сравнение, но все же).

Они сами делают также, код идентичен. Только они сначала сдвигают по о.x и о.z, а потом прописывают прыжок как отдельный сдвиг, а я все в одно запихал.

Вот за это спасибо, позже проверю. Мб свою isGrounded написать надо будет. Потом протестирую и отпишусь, если что-то выйдет.

FPS Character Controller
Не могу понять в чём проблема. А именно что нужно изменить. using System; using UnityEngine;.

Рывок для Character Controller
Как сделать рывок моего персонажа? Пользуюсь character controller’ом. Например: мой перс.

Рывок для Character Controller
Здравствуйте, хотелось бы узнать, как сделать рывок персонажа в совей игре. Делаю обращение в.

Использование компонента character controller
Можно не использовать скрипт для компонента Character Controller для передвижения человека в.

Как синхронизировать character controller с анимацией?
Здравствуйте, подскажите, есть ли способ синхронизировать character controller с анимацией или в.

Источник

Is Grounded в 2D платформере: как узнать, стоит ли персонаж?

Постановка задачи

Есть персонаж, есть платформы. Само собой, на персонаже коллайдер и ригидбоди, всё двадэ. На платформах тоже коллайдеры. На платформах — эффекторы, ибо платформы должны быть твердые только сверху. То есть, если перснаж упал на платформу, он на ней стоит. Но если персонаж идет мимо платформы или прыгает под ней — он свободно проходит через нее.

Персонаж может прыгать, только если стоит на платформе. Нужно знать, стоим ли мы.

1) Форма платформы произвольная.
2) Персонаж может стоять на самом краю платформы.
3) Платформы могут быть наклонными.
4) Платформы могут двигаться.

Популярное решение и почему оно не подходит

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

1) Если мы «идем мимо» или «запрыгиваем на», то рэйкаст вполне поймает «землю», хотя персонаж не стоит.
2) Рэйкаст работает по конкретной точке, а не по площади. А значит, если платформа не будет находиться именно под точкой рэйкаста — например, мы стоим на краю платформы, или на маленьком камушке — проверка ее не заметит.

Решение

Решение нельзя получить логически, только опытным путем. Ибо оно проистекает из особенностей работы физики движка. Вам нужны:
using System.Linq — вообще удобная штука, рекомендую ознакомиться, если еще не. Использую для поиска по коллекциям, уничтожает 90% форычей с вложенными ифами.
GetComponent().bounds.min.y — низ вашего коллайдера, то бишь минимальная ордината
OnCollisionStay2D docs.unity3d.com/ScriptReference/Collider2D.OnCollisionStay2D.html
OnCollisionExit2D
CollisionContacts docs.unity3d.com/ScriptReference/Collision-contacts.html docs.unity3d.com/ScriptReference/ContactPoint-point.html

OnCollisionStay2D срабатывает, когда персонаж и платформа движутся друг относительно друга. При попадании персонажа на платформу т.е. при OnCollisionEnter2D вышеуказанное событие тоже сработает.

Так вот, оказывается, если персонаж стоит на платформе, то геометрически его коллайдер и коллайдер платформы не пересекаются. А значит, «низ персонажа» должен быть ВНЕЗАПНО выше точки контакта. ВСЁ!

1) Создаем список:

2) По событию OnCollisionStay2D проверяем и при необходимости добавляем коллайдеры:

3) Если больше не пересекаемся с платформой — удаляем ее из списка:

4) Угадайте, что проверяем:

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

Источник

Character controller isgrounded не работает

Каким образом перемещать персонажа по неровной поверхности?

Chaz Дата: Суббота, 18 Января 2014, 17:03 | Сообщение # 1

Привет. Такая беда. Если перемещать персонажа при помощи CharacterController.Move, то значение CharacterController.isGrounded меняется каждый раз, когда я иду по ровной поверхности. Оно будет false, если я подпрыгну, и будет true, если я стою на земле, но когда я иду, то оно меняется из false в true и обратно много раз подряд. Если использовать Translate для передвижения персонажа, то значение isGrounded стабильно, то есть, если на земле, то true, если в воздухе, то false, если двигаюсь по земле, то true, но если я пытаюсь забратся на горбик или ввойти в стену, то я прохожу сквозь меш, а CharacterController.Move позволяет подниматся на горку и останавливатся, если переоснаж двигается в стену. Подскажите же, как сделать, чтобы персонаж и на горку поднимался и при ходьбе по земле значение isGrounded было true?
Вот скрипт, может я неверно двигаю персонажа методом Move?

200?’200px’:»+(this.scrollHeight+5)+’px’);»>
using System;
using System.Timers;
using UnityEngine;
using System.Collections;

public class Move : MonoBehaviour
<

public float speed;
public float fallSpeed = 1;

private Transform camera, player;

private Transform myTrans;
private Vector3 direction;
private CharacterController controller;
private Vector3 rotVect;
private float Yjump;

// Use this for initialization
void Start ()
<
direction = Vector3.zero;
speed = speed == 0 ? 10:speed;
camera = GameObject.FindGameObjectWithTag(«Camera»).transform;
player = GameObject.FindGameObjectWithTag(«Player»).transform;
myTrans = transform;
controller = this.gameObject.GetComponent ();
>

// Update is called once per frame
void Update ()
<
direction = Vector3.zero;

if (Input.GetKey(KeyCode.W))
<
direction += camera.forward;
direction.y = 0;
>

if (Input.GetKey(KeyCode.S))
<
direction += -camera.forward;
direction.y = 0;
>

if (Input.GetKey(KeyCode.D))
<
direction += camera.right;
direction.y = 0;
>

if (Input.GetKey(KeyCode.A))
<
direction += -camera.right;
direction.y = 0;
>

if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D))
<
myTrans.forward = direction.normalized;
//controller.Move(direction.normalized*speed*Time.deltaTime);
myTrans.Translate(direction.normalized * speed * Time.deltaTime);
>
Debug.Log(controller.isGrounded);
>

void FixedUpdate()
<
if (Input.GetKeyDown(KeyCode.Space))
<
if (controller.isGrounded)
Yjump = 1f;
>

if (Yjump != 0 || Yjump>0)
<
controller.Move(myTrans.up*Yjump);
Yjump -= Time.deltaTime;
if (Yjump

Левша Дата: Суббота, 18 Января 2014, 17:15 | Сообщение # 2

Столкнувшись когда то с аналогичной проблемой я просто повесил на персонажа еще один мелкий сфераКолайдер — триггер в ногах.
Работает надежно.
X.cor.R (Prologue)
Chaz Дата: Суббота, 18 Января 2014, 17:36 | Сообщение # 3

Левша, а я думал пускать луч из ног, и проверять дистанцию до точки столкновения, это норм или лучше сфера колайдер?
Левша Дата: Суббота, 18 Января 2014, 18:26 | Сообщение # 4

Тоже можно, но рейкаст в Update наверно понакладнее будет.
X.cor.R (Prologue)

Chaz Дата: Суббота, 18 Января 2014, 18:36 | Сообщение # 5

слушайте, глюк какой-то. Нацепил на персонажа сферический коллайдер, поставил галочку напротив is trigger. Далее назначил земле тег Ground и написал такой код

200?’200px’:»+(this.scrollHeight+5)+’px’);»> using System;
using System.Timers;
using UnityEngine;
using System.Collections;

public class Move : MonoBehaviour
<

public float speed;
public float fallSpeed = 1;
public bool isGrounded = false;

private Transform camera, player, mesh;
private SphereCollider sphereCollider;
private Transform myTrans;
private Vector3 direction;
private CharacterController controller;
private Vector3 rotVect;
private float Yjump;

// Use this for initialization
void Start ()
<
direction = Vector3.zero;
speed = speed == 0 ? 10:speed;
camera = GameObject.FindGameObjectWithTag(«Camera»).transform;
player = GameObject.FindGameObjectWithTag(«Player»).transform;
mesh = GameObject.FindGameObjectWithTag(«Mesh»).transform;
sphereCollider = gameObject.GetComponent ();
myTrans = transform;
controller = this.gameObject.GetComponent ();
>

// Update is called once per frame
void Update ()
<
direction = Vector3.zero;

if (Input.GetKey(KeyCode.W))
<
direction += camera.forward;
direction.y = 0;
>

if (Input.GetKey(KeyCode.S))
<
direction += -camera.forward;
direction.y = 0;
>

if (Input.GetKey(KeyCode.D))
<
direction += camera.right;
direction.y = 0;
>

if (Input.GetKey(KeyCode.A))
<
direction += -camera.right;
direction.y = 0;
>

if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D))
<
mesh.forward = direction.normalized;
controller.Move(direction.normalized*speed*Time.deltaTime);
// myTrans.Translate(direction.normalized * speed * Time.deltaTime);
>
Debug.Log(controller.isGrounded);
>

void FixedUpdate()
<
if (Input.GetKeyDown(KeyCode.Space))
<
if (isGrounded)//controller.isGrounded)
Yjump = 1f;
>

if (Yjump != 0 || Yjump>0)
<
controller.Move(myTrans.up*Yjump);
Yjump -= Time.deltaTime;
if (Yjump void OnTriggerStay(Collider other)
<
if (other.tag == «Ground»)
<
isGrounded = true;
Debug.Log(«grounded from stay»);
>
>

постоянно срабатыват, хотя я не стою на земле, че это за глюк такой.

Левша Дата: Суббота, 18 Января 2014, 19:44 | Сообщение # 6

Используй другую bool переменную для контроля, оставь этот isGrounded в покое.
Вот такая примерно конструкция:


X.cor.R (Prologue)

Chaz Дата: Суббота, 18 Января 2014, 19:53 | Сообщение # 7

Левша, так я так и делаю, isGrounded это моя переменная, а не от CharacterController’а
Левша Дата: Суббота, 18 Января 2014, 19:55 | Сообщение # 8

X.cor.R (Prologue)

Chaz Дата: Суббота, 18 Января 2014, 20:01 | Сообщение # 9

200?’200px’:»+(this.scrollHeight+5)+’px’);»> void FixedUpdate()
<
if (Input.GetKeyDown(KeyCode.Space))
<
if (isGrounded)//controller.isGrounded)
Yjump = 1f;
>

if (Yjump != 0 || Yjump>0)
<
controller.Move(myTrans.up*Yjump);
Yjump -= Time.deltaTime;
if (Yjump

Левша Дата: Суббота, 18 Января 2014, 20:24 | Сообщение # 10

И все таки смени имя переменной.
OnTriggerEnter — не нужен.

200?’200px’:»+(this.scrollHeight+5)+’px’);»>
var ground : boolean = true;

function OnTriggerStay (hit : Collider) <
if (hit.tag == «Floor») ground = true;
>
function OnTriggerExit (hit : Collider) <
if (hit.tag == «Floor») ground = false;
>

Chaz Дата: Суббота, 18 Января 2014, 20:34 | Сообщение # 11

Левша, та же фигня
Левша Дата: Суббота, 18 Января 2014, 21:25 | Сообщение # 12

А гравитация ? Она все время должна работать, не зависимо на земле ты или в воздухе.
X.cor.R (Prologue)

Chaz Дата: Суббота, 18 Января 2014, 21:30 | Сообщение # 13

Левша, хм, а у меня работает только если в воздухе, окей, сделаю, чтобы всегда работала хД надеюсь, это никак не отразится на перемещении. И это, а как мне тогда ускорение гравитации сделать? у меня просто такое условие — если перс в воздухе, то двигаем его вниз, и увеличиваем скорость падения, а когда на земле, то значение скорости обнуляется и он не падает вниз.
Левша Дата: Суббота, 18 Января 2014, 21:51 | Сообщение # 14

Ну это же в реале не так, я понимаю что это симуляция, но лучше придерживатся реальной модели поведения.
Меньше будет побочных, неучтенных проявлений.
А по факту — у тебя видимо не срабатывает выход из триггера.
Попробуй навесить на землю риджБодю с галочкой на IsKinematic.
X.cor.R (Prologue)

Chaz Дата: Воскресенье, 19 Января 2014, 04:24 | Сообщение # 15

Левша, риджидБадя и так уже висела, и с IsKinematic триггеры как-раз не детектятся, но я убрал IsKinematic и просто зафризил риджидБадю, и тогда триггеры детектятся, но проблема все же осталась, я позже видюшку запишу и покажу вам, увидите насколько это все абсурдно, когда с одной части обрыва персонаж падает, а с другой нет =(
Левша Дата: Воскресенье, 19 Января 2014, 04:57 | Сообщение # 16

С чего это ? о_О
У меня детектятся.
X.cor.R (Prologue)

Chaz Дата: Воскресенье, 19 Января 2014, 15:53 | Сообщение # 17

Левша, ой! у меня тоже детектиться, но как-то плохо, триггер на вход и на нахождение чего-то в триггере не работает сразу, нужно поколотить персонажа, и тогда тока все срабатывает, и то криво работает. Вот я видюшку записал, значение True и False в консоли, относятся к CharacterController.isGrounded, а остальные штуки относятся к искусственной переменной isGrounded. Как вы и говорили, триггер на выход не срабатывает, а триггер на нахождение внутри работает даже если сферка очень далеко от земли.
ВИДЮШКА
allods Дата: Воскресенье, 19 Января 2014, 17:02 | Сообщение # 18

по мне так рейкст надо, один рейкаст с перса не просадит вам фпс
Chaz Дата: Понедельник, 20 Января 2014, 14:43 | Сообщение # 19

allods, ну я еще могу использовать и треггеры и переменную от CharacterController’a. Триггер работает, когда персонаж на земле, а CharacterController.isGrounded хорошо работает, когда перс в воздухе
upd: фигню я сморозил, тогда буду дожидатся ответа Левши или запилю рейкастом.
upd2: сделал постоянную гравитацию, ну и ясный пень, теперь работает все чотко, но все рарвно интересно, почему же триггер на выходе не срабатывает

Добавлено (20.01.2014, 14:43)
———————————————
Значит сделал постоянную гравитацию + рейкаст. Но вот же проблема, лучик тоненький, а персонаж толстенький, и вот на этом скриншоте

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

set16 Дата: Понедельник, 20 Января 2014, 14:59 | Сообщение # 20

Вот скрипт не дает лазать по горам и не позволяет рулить в прыжке

200?’200px’:»+(this.scrollHeight+5)+’px’);»>
using UnityEngine;
using System.Collections;

[RequireComponent (typeof (CharacterController))]
public class ChrContP: MonoBehaviour <

public float walkSpeed = 6.0f;
public float rotspeed = 20f;
public float runSpeed = 11.0f;
public bool limitDiagonalSpeed = true;
public bool toggleRun = false;
public float jumpSpeed = 8.0f;
public float gravity = 20.0f;
public float fallingDamageThreshold = 10.0f;
public bool slideWhenOverSlopeLimit = false;
public bool slideOnTaggedObjects = false;
public float slideSpeed = 12.0f;
public bool airControl = false;
public float antiBumpFactor = .75f;
public int antiBunnyHopFactor = 1;
private Vector3 moveDirection = Vector3.zero;
private bool grounded = false;
private CharacterController controller;
private Transform myTransform;
private float speed;
private RaycastHit hit;
private float fallStartLevel;
private bool falling;
private float slideLimit;
private float rayDistance;
private Vector3 contactPoint;
private bool playerControl = false;
private int jumpTimer;

void Start() <
controller = GetComponent ();
myTransform = transform;
speed = walkSpeed;
rayDistance = controller.height * .5f + controller.radius;
slideLimit = controller.slopeLimit — .1f;
jumpTimer = antiBunnyHopFactor;
>

void FixedUpdate() <
float inputX = Input.GetAxis(«Horizontal»);
float inputY = Input.GetAxis(«Vertical»);
float inputModifyFactor = (inputX != 0.0f && inputY != 0.0f && limitDiagonalSpeed)? .7071f : 1.0f;

if (grounded) <
bool sliding = false;
if (Physics.Raycast(myTransform.position, -Vector3.up, out hit, rayDistance)) <
if (Vector3.Angle(hit.normal, Vector3.up) > slideLimit)
sliding = true;
>
else <
Physics.Raycast(contactPoint + Vector3.up, -Vector3.up, out hit);
if (Vector3.Angle(hit.normal, Vector3.up) > slideLimit)
sliding = true;
>

if (falling) <
falling = false;
if (myTransform.position.y = antiBunnyHopFactor) <
moveDirection.y = jumpSpeed;
jumpTimer = 0;
>
>
else <
if (!falling) <
falling = true;
fallStartLevel = myTransform.position.y;
>

moveDirection.y -= gravity * Time.deltaTime;
transform.Rotate(0,inputX * rotspeed * Time.deltaTime,0);
grounded = (controller.Move(moveDirection * Time.deltaTime) & CollisionFlags.Below) != 0;
>

void OnControllerColliderHit (ControllerColliderHit hit) <
contactPoint = hit.point;
>

void FallingDamageAlert (float fallDistance) <
print («Ouch! Fell » + fallDistance + » units!»);
>
>

Источник

Читайте также:  Проблема не работает триколор
Оцените статью