Среда, 27 Ноября 2024, 10:01

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Отталкивание от стен
ArtM@nДата: Вторник, 27 Августа 2019, 13:01 | Сообщение # 1
был не раз
Сейчас нет на сайте
Добрый день, как можно реализовать отталкивание от стен при прыжке персонажа вот код самого персонажа
Код

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

public class Slim : MonoBehaviour
{

    public float speed;
    public float jumpForce;
    private float moveInput;

    private Rigidbody2D rb;

    private bool facingRight = true;

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

    private int extraJumps;
    public int extraJumpsValue;

    private void Start()
    {
        extraJumps = extraJumpsValue;
        rb = GetComponent<Rigidbody2D>();
    }

    private void FixedUpdate()
    {
        isGrounded = Physics2D.OverlapCircle(groundCheck.position, checkRadius, whatIsGround);

        moveInput = Input.GetAxis("Horizontal");
        rb.velocity = new Vector2(moveInput * speed, rb.velocity.y);

        if(facingRight == false && moveInput < 0)
        {
            Flip();
        }
        else if (facingRight == true && moveInput > 0)
        {
            Flip();
        }
    }

    void Flip()
    {
        facingRight = !facingRight;
        Vector3 Scaler = transform.localScale;
        Scaler.x *= -1;
        transform.localScale = Scaler;
    }

    public void Update()
    {
        if (isGrounded == true)
        {
            extraJumps = extraJumpsValue;
        }

        if (Input.GetKeyDown(KeyCode.Space) && extraJumps > 0)
        {
            rb.velocity = Vector2.up * jumpForce;
            extraJumps--;
        }
        else if (Input.GetKeyDown (KeyCode.Space) && extraJumps == 0 && isGrounded == true)
        {
            rb.velocity = Vector2.up * jumpForce;
        }
    }
    void OnCollisionEnter2D(Collision2D co)
    {
        // Collided with a V?
        if (co.collider.name == "V")
        {
            // Reset Rotation, Gravity, Velocity and go to last Checkpoint
            transform.rotation = Quaternion.identity;
            rb.gravityScale = Mathf.Abs(rb.gravityScale);
            rb.velocity = Vector2.zero;
        }
    }

    

}

InsaneSystemsДата: Вторник, 27 Августа 2019, 17:53 | Сообщение # 2
участник
Сейчас нет на сайте
ArtM@n, проверяй стену в направлении движения персонажа и при повторном нажатии прыжка если стена есть то отталкивай его в направлении от стены. Можно попробовать Vector.Mirror или взять нормаль столкновения, но проще просто задать силу в нужном направлении для получения всегда одинакового результата.

Сообщение отредактировал InsaneSystems - Вторник, 27 Августа 2019, 17:53
ShortKedrДата: Среда, 28 Августа 2019, 20:54 | Сообщение # 3
Renword Studio
Сейчас нет на сайте
Цитата InsaneSystems ()
ArtM@n, проверяй стену в направлении движения персонажа и при повторном нажатии прыжка если стена есть то отталкивай его в направлении от стены. Можно попробовать Vector.Mirror или взять нормаль столкновения, но проще просто задать силу в нужном направлении для получения всегда одинакового результата.


ArtM@n, немного векторной математики(хотя у Unity уже ваша проблема решена с векторами см. цитату). Рейкастим(Physics.Raycast) по направлению персонажа луч короткий, получаем точку столкновения(если получаем). Если получили. смотрим инфу о столкновении(RaycastHit), если это стенка - получаем нормаль, по нормали и направлению перса получаем отражающий вектор по этому вектору добавляем скорость игроку, например через стандартный RigidBody, всё. Замечу что если у персонажа скорость только горизонтальная, он и будет отталкиваться только по горизонтали Поэтому, как писалось выше, и как делалось во многих играх - отталкивание всегда по фиксированному вектору происходит, повернутому от стены. Поворачивать точки в 3д пространстве можно очень просто при помощи матриц поворота. Однако, можно и без них обойтись, сделав всё проще в разы



Сообщение отредактировал ShortKedr - Среда, 28 Августа 2019, 21:04
AlexanderBekkerДата: Четверг, 29 Августа 2019, 10:15 | Сообщение # 4
BekkerDev Studio
Сейчас нет на сайте
Я в Java так делал:
Код
if (Key.pressed(KeyEvent.VK_SPACE) && !free(motion.x, 0)) {
   motion.x = -Math.signum(motion.x) * 4f;
   motion.y = -2f;
}

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


Разработчик, композитор и издатель инди-игр в Steam.
Редактор карт: BekkerDev Level Editor 4
Страница разработчика в Steam
Паблик ВК: BekkerDev Studio
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг