Как притянуть персонажа к платформе (Transform)
Я новичок в Unity. Сейчас делаю 2D игру, где персонаж перемещается в космосе. Он может притягиваться к платформам и стенам.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AstroAttract : MonoBehaviour{
[SerializeField] AstroScript astroScr;
[Header("Attract variables")]
[SerializeField] private LayerMask whatIsObstacle;
private bool isTouchingObstacle;
private Vector3 posCur;
private Quaternion rotCur;
private void Start()
{
print("Astro Attract");
astroScr.rb.constraints = RigidbodyConstraints2D.FreezeRotation; //Остановка вращения дабы, персонаж не вращался по инерции
}
private void Update()
{
RaycastHit2D hit = new RaycastHit2D(); //Инициализация луча для распознования столкновения
hit = Physics2D.Raycast(transform.position, transform.TransformDirection(-Vector3.up), .7f, whatIsObstacle); //Задания параметров луча
if (hit.collider.tag == "Obstacle")
{
isTouchingObstacle = true;
}
else
{
isTouchingObstacle = false;
}
rotCur = Quaternion.FromToRotation(Vector3.up, hit.normal); //Создание нормали к поверхности
posCur = new Vector3(transform.position.x, hit.point.y, transform.position.z); //Текущее положение луча
if (isTouchingObstacle && (Input.GetButtonDown("Fire2")))
{
//Булевые
astroScr.canShoot = false;
astroScr.mouseRotationActive = false;
astroScr.astroInputScr.rotateBtnActive = false;
astroScr.arrow.SetActive(true);
//Физика
astroScr.rb.velocity = Vector2.zero;
astroScr.rb.drag = 10f;
transform.rotation = Quaternion.Lerp(transform.rotation, rotCur, 5f);
astroScr.rb.AddForce(posCur * 20f);
}
}
//Создание графического представления луча
private void OnDrawGizmos()
{
Gizmos.color = Color.red;
Gizmos.DrawRay(transform.position, transform.TransformDirection(0f, -.7f, 0f));
}
}
То есть я рисую луч от персонажа вниз и если он входит в стену, то появляется возможность притянуться к ней. Я реализовал поворот персонажа по нормали, с этим все хорошо. Есть проблемы с самим притяжением, которое я реализовал вот так
astroScr.rb.AddForce(posCur * 20f);
Дело в том, что персонаж может развернуться и притянуться к воздуху как на этой картинке
Я так полагаю, нужно как-то определять сторону в которую ему нужно сместиться и смещать его туда, но не понимаю как это реализовать. Если возникнут вопросы, то могу показать больше кода.
