AnimusMortis
@AnimusMortis

Как исправить, что бы персонаж в Unity не улетал в «космос» при прыжке у стены?

День добрый!
Самоучка потому многое не понимаю. Составлял скрипт на перса, что бы он нормально перемещался, но всё время получал новые баги потому собрал скрипт из различных источников. Всё вроде нормально работает, но при прыжке у стены персонаж улетает в "космос". Играл со значениями диаметра поиска земли - не помогает. Менял точку поиска у перса, тоже не выходит.
Для понимания полный скрипт ниже:

spoiler

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;


public class PControler2 : MonoBehaviour{
    [SerializeField]
    private int lives = 5;
    [SerializeField]
    private float speed = 3.0F;
    [SerializeField]
    private float jumpForce = 5.0F;

    private bool isGrounded;
	public Transform groundCheck;
	public float checkRadius;
	public LayerMask whatIsGround;

    new private Rigidbody2D rigidbody;
    private Animator animator;
    private SpriteRenderer sprite;
	private int extraJumps;
	public int extraJumpsValue;

    private void Awake()    {	
        rigidbody = GetComponent<Rigidbody2D>();  
        animator = GetComponent<Animator>();
        sprite = GetComponentInChildren<SpriteRenderer>();
    }
	private void Start()	{
		extraJumps = extraJumpsValue;
		rigidbody = GetComponent<Rigidbody2D>();
	}
    private void FixedUpdate()    {
		isGrounded = Physics2D.OverlapCircle(groundCheck.position, checkRadius, whatIsGround);
        CheckGround();
    }

    private void Update()    {
		if (isGrounded == true)
		{
			extraJumps = extraJumpsValue;
		}
		if (Input.GetButton("Horizontal")) { Run();}
		if (Input.GetButton("Jump")&& extraJumps > 0) { Jump();
			extraJumps --;}
		else if (Input.GetButton("Jump")&& extraJumps == 0 && isGrounded == true)		{
					}
	}
    private void Run()    {
        Vector3 direction = transform.right * Input.GetAxis("Horizontal");

        transform.position = Vector3.MoveTowards(transform.position, transform.position + direction, speed * Time.deltaTime);

        sprite.flipX = direction.x < 0.0F;
    }

    private void Jump()    {
        rigidbody.AddForce(transform.up * jumpForce, ForceMode2D.Impulse);
    }

    private void CheckGround()    {
        Collider2D[] colliders = Physics2D.OverlapCircleAll(transform.position, 0.6F);

        isGrounded = colliders.Length > 1;
    }
}

  • Вопрос задан
  • 1842 просмотра
Пригласить эксперта
Ответы на вопрос 1
dollar
@dollar
Делай добро и бросай его в воду.
Код:
isGrounded = Physics2D.OverlapCircle(groundCheck.position, checkRadius, whatIsGround);

Не работает, потому что сразу же после этого вызывается функция CheckGround(), в которой переменная isGrounded снова перезаписывается:
Collider2D[] colliders = Physics2D.OverlapCircleAll(transform.position, 0.6F);
isGrounded = colliders.Length > 1;

Поэтому первую строчку вообще не будем рассматривать, эта пустышка, которая ничего не делает, только процессор нагружает лишний раз. Разберем, что же происходит в последних строках.
Вы считаете количество коллайдеров в круговой области. И если оно больше 1, то isGrounded будет true.
Видимо, около стены вы также считаете стену. Поэтому наличие стены делает isGrounded = true.
В чем здесь логика, вам виднее.
Исправляйте. :)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы