#c# #unity3d
#c# #unity3d
Вопрос:
привет, я хочу переместить свой символ, я огляделся, но не смог найти решения для своего кода, я просто хочу, когда мой символ перемещается, и я не нажал кнопку перемещения вперед, тогда он останавливается, но не мгновенно, он просто останавливается мгновенно после того, как я нажал кнопку d вот мой код
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Move : MonoBehaviour
{
public Rigidbody2D rb2d;
bool ismoving;
public float speed = 5f;
void FixedUpdate()
{
float horizontal = Input.GetAxis("Horizontal");
if (Input.GetButton("Horizontal"))
{
ismoving = true;
}
else { ismoving = false; }
if (ismoving)
{
rb2d.AddForce(new Vector2(horizontal, 0) * speed * Time.fixedDeltaTime *10);
}
else
{
while((rb2d.velocity) != (rb2d.velocity = Vector2.zero))
{
rb2d.AddForce(new Vector2(horizontal, 0) * Time.fixedDeltaTime *-1);
}
}
}
}
Комментарии:
1. Пожалуйста, убедитесь, что вы используете правильные теги. Ваш код находится в
c#
…unityscript
является / был разновидностью JavaScript, подобной пользовательскому языку, ранее использовавшемуся Unity, и к настоящему времени давно устарел
Ответ №1:
Вы можете изменить множитель для вашего замедления на большее значение
while((rb2d.velocity) != (rb2d.velocity = Vector2.zero))
{
rb2d.AddForce(new Vector2(horizontal, 0) * Time.fixedDeltaTime * -10);
}
Теперь он должен замедляться в 10 раз быстрее, чем раньше
Ответ №2:
В настоящее время вы перестаете добавлять силу при отпускании клавиши. Как насчет приближения к скорости 0 после отпускания клавиши? Вот так:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Move : MonoBehaviour
{
public Rigidbody2D rb2d;
bool ismoving;
public float maxspeed = 5f;
private float currentSpeed = 0f;
private float movingDirection = 0f;
void FixedUpdate()
{
float horizontal = Input.GetAxis("Horizontal");
if (Input.GetButton("Horizontal"))
{
ismoving = true;
movingDirection = horizontal;
}
else
{
ismoving = false;
// keep the movingDirection as it is.
}
if (ismoving)
{
// accelerate
currentSpeed = 5 * Time.fixedDeltaTime;
currentSpeed = Mathf.Clamp(currentSpeed, 0, maxspeed);
}
else
{
currentSpeed -= 5 * Time.fixedDeltaTime;
currentSpeed = Mathf.Clamp(currentSpeed, 0, maxspeed);
// also fake some friction
rb2d.velocity = rb2d.velocity * 0.96f;
}
// always apply the force, it may be 0 though.
rb2d.AddForce(new Vector2(movingDirection, 0) * currentSpeed;
}
}
Возможно, это работает лучше при установке скорости вместо добавления силы при таком подходе. Но вы можете понять суть: вместо того, чтобы мгновенно останавливаться, чтобы добавить силу при отпускании клавиши, мы просто уменьшаем переменную currentspeed
и продолжаем работать с ней, пока не остановимся. Поскольку horizontal
после отпускания клавиши быстро становится 0, я добавил вспомогательную переменную, чтобы запомнить направление, в котором мы двигались, прежде чем отпускать вызываемый movingDirection
ключ.
Также полезный совет: попробуйте выполнять все Input...
вызовы Update()
, сохраняя состояния в переменных, которые вы затем используете FixedUpdate()
. Потому что в противном случае вы можете столкнуться с проблемами, когда такие вещи, как Input.GetButtonDown()
is true для 2-3 вызовов FixedUpdate, но вы хотите, чтобы что-то происходило один раз за клик / нажатие, как стрельба.