Страница 1 из 1
Как исправиьть замедление персонажа
Добавлено:
04 апр 2021, 07:16
DarkLight Games
Здравствуйте, у меня такой вопрос
Есть строчка кода rb.MovePosition(transform.position + TargetPos.normalized * Speed);
Она должна обеспечивать равномерное движение персонажа, но по приближении к игроку он замедляется. Я не могу понять в Чём ошибка.
До этого пробовал так transform.Translate(TargetPos.normalised * Speed), результат почти тот же.
Re: Как исправиьть замедление персонажа
Добавлено:
04 апр 2021, 09:38
1max1
TargetPos это должно быть дельтой позиций, то бишь (TargetPos - startPosition).
Re: Как исправиьть замедление персонажа
Добавлено:
04 апр 2021, 09:47
DarkLight Games
У меня TargetPos равен позиция игрока - позиция этого персонажа. Двигается он в нужную сторону, проблемма в том, что чем ближе персонаж к игроку, тем медленнее он двигается, и я не знаю как это исправить.
Re: Как исправиьть замедление персонажа
Добавлено:
04 апр 2021, 09:49
waruiyume
Не идти вниз?
Re: Как исправиьть замедление персонажа
Добавлено:
04 апр 2021, 09:51
DarkLight Games
Персонаж должен двигаться с одной скоростью вместо того чтобы замедляться
Re: Как исправиьть замедление персонажа
Добавлено:
04 апр 2021, 10:20
waruiyume
Если 2 объекта находятся не на одной координате по оси Y(спойлер: это практически невозможно), то вектор движение будет под наклоном в землю/небо, и чем ближе пес к точке назначении и больше разница в высоте, тем сильнее будет заваливаться вектор движения.
Re: Как исправиьть замедление персонажа
Добавлено:
04 апр 2021, 10:32
DarkLight Games
У меня уже были подобные мысли, спасибо за совет
Re: Как исправиьть замедление персонажа
Добавлено:
04 апр 2021, 10:40
DarkLight Games
А тогда ещё один вопрос: как сделать чтобы этот персонаж смотрел на игрока и разворачивался плавно, а не мгновенно?
Re: Как исправиьть замедление персонажа
Добавлено:
04 апр 2021, 10:53
1max1
Твой код должен быть таким:
Используется csharp
rb.MovePosition(transform.position + (TargetPos - transform.position).normalized * Speed);
Второй вопрос гуглится изи
https://forum.unity.com/threads/smooth-look-at.26141/
Re: Как исправиьть замедление персонажа
Добавлено:
04 апр 2021, 13:39
DarkLight Games
Попробовал через Slerp, он просто разворачивается на какой-то градус и так и остаётся, хотя угол вращения пересчитывается каждое обновление метода FixedUpdate
Re: Как исправиьть замедление персонажа
Добавлено:
04 апр 2021, 14:17
Alkos26Rus
DarkLight Games писал(а):Попробовал через Slerp, он просто разворачивается на какой-то градус и так и остаётся, хотя угол вращения пересчитывается каждое обновление метода FixedUpdate
Вставляй код как ты делаешь, а то ты заявляешь и мы должны верить на слово что якобы Slerp не работает, скорей всего ты просто не правильно его используешь
Re: Как исправиьть замедление персонажа
Добавлено:
04 апр 2021, 14:34
DarkLight Games
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SturmVirusRotateScript : MonoBehaviour
{
Vector3 StartPos;
Vector3 CharacterPos;
Vector3 TargetPos;
Quaternion Rotation;
float Angle;
[SerializeField] float Offset;
[SerializeField] float RotSpeed;
GameObject character;
private void Start()
{
character = GameObject.Find("Character");
StartPos = this.transform.position;
CharacterPos = character.transform.position;
TargetPos = CharacterPos - StartPos;
}
private void FixedUpdate()
{
if (transform.position.y >= CharacterPos.y)
{
CharacterPos = character.transform.position;
TargetPos = CharacterPos - transform.position;
Angle = Mathf.Atan2(TargetPos.x, TargetPos.y) * Mathf.Rad2Deg;
Rotation = new Quaternion(0, 0, -Angle - Offset, transform.rotation.w);
transform.rotation = Quaternion.Slerp(transform.rotation, Rotation, RotSpeed);
}
if (transform.position.y < CharacterPos.y) // не доделано
{
CharacterPos = character.transform.position;
TargetPos = CharacterPos - StartPos;
Angle = Mathf.Atan2(TargetPos.x, TargetPos.y) * Mathf.Rad2Deg;
transform.rotation = Quaternion.Euler(0, 0, -Angle - Offset);
}
}
}
Re: Как исправиьть замедление персонажа
Добавлено:
04 апр 2021, 15:23
Alkos26Rus
Используется csharp
private void FixedUpdate()
{
CharacterPos = character.transform.position;
TargetPos = CharacterPos - transform.position;
Angle = Mathf.Atan2(TargetPos.x, TargetPos.y) * Mathf.Rad2Deg;
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.Euler(0, 0, -Angle - Offset), RotSpeed);
}
И убери пока условие if (transform.position.y >= CharacterPos.y) и вторую часть кода которая недоделана а просто протесть вот эту часть кода, скорость возможно нужно уменьшить если сильно быстро поворачивается. Потом уже добавляй свои условия когда сам поворот будет работать, мало ли может у тебя условие не срабатывает