Я делаю систему, возможно, лучше всего описанную как телекинез. Игрок щелкает, чтобы подобрать ближайшее подвижное твердое тело, которое затем переходит в якорное преобразование (которое подпрыгивает вверх и вниз по синусоиде, поэтому кажется, что твердое тело плавает вверх и вниз). Эта часть работает нормально. Однако когда я снова щелкаю левой кнопкой мыши, жесткое тело должно просто упасть на место. Проблема в том, что он делает это странное дрожание, как будто не может решить, следует ли ему следовать за якорем или упасть на землю.
Мой код выглядит примерно так.
Сначала проверьте правильность ввода:
if (holding == false && keyDown == false && abilitySwitch.disabling == false)
{
//Right click picks up the closest dragable.
if (Input.GetMouseButtonDown(1))
{
PickupClose();
}
...
else if (holding == true && keyDown == true && abilitySwitch.disabling == false)
{
//Right click while holding executes an indirect attack.
if (Input.GetMouseButtonDown(1))
{
AttackIndirect();
}
Функция срабатывания выглядит следующим образом:
public void PickupClose()
{
dragTarget = ClosestDragable();
if (ClosestDragable() != null)
{
Debug.Log("Pickup close has run.");
Debug.Log(dragTarget);
holding = true;
keyDown = true;
dragTarget.GetComponent<Rigidbody>().useGravity = false;
startCo = true;
}
else
{
Debug.Log("No dragable object in range.");
}
}
startCo проверено в FixedUpdate и, если он включен, то вызывается следующая сопрограмма:
private IEnumerator MoveTargetToPosition(Vector3 target)
{
float t = 0f;
Vector3 start = dragTarget.transform.position;
while (t <= 1)
{
t += Time.fixedDeltaTime / baseSpeed;
dragTarget.GetComponent<Rigidbody>().MovePosition(Vector3.Slerp(start, target, t));
yield return null;
}
}
Когда функция атаки запущена:
public void AttackIndirect()
{
Debug.Log("Attack indirectly has run.");
holding = false;
keyDown = false;
isHeld = false;
startCo = false;
dragTarget.GetComponent<Rigidbody>().useGravity = true;
dragTarget.GetComponent<Rigidbody>().velocity = Vector3.zero;
}
Преобразование изменения синусоидальной волны / положения якоря обрабатывается отдельный скрипт на пустом игровом объекте:
void Update()
{
Vector3 pos = bobber.transform.position;
float newY = (Mathf.Sin(Time.time * speed)/4);
transform.position = new Vector3(pos.x, newY + 2, pos.z);
}
Вот видео о том, как выглядит проблема.
Как вы можете видеть, сфера, похоже, пытается падать и одновременно следовать цели. Когда я медленно вращаюсь, когда запускаю функцию атаки, шар скользит от того места, где он должен упасть, примерно до половины между этой точкой и местом, где заканчивается якорь.
Как я могу избежать этой проблемы, все еще делая эту достаточно плавную