Как притянуть персонажа к платформе (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);

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

Screen

Я так полагаю, нужно как-то определять сторону в которую ему нужно сместиться и смещать его туда, но не понимаю как это реализовать. Если возникнут вопросы, то могу показать больше кода.


Ответы (0 шт):