Персонаж не может двигаться после прикосновения к стене - PullRequest
0 голосов
/ 06 января 2019

Я делаю клон pacman, используя онлайн-учебник. Я только что начал движение Пакмана, и когда Пакман касается стены, он больше не может двигаться. Вот сценарий движения

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

public class pacman : MonoBehaviour
{
public int speed;
Vector2 dest;
// Start is called before the first frame update
void Start()
{
    dest = transform.position;
    speed = 5;

}

// Update is called once per frame
void FixedUpdate()
{
    Vector2 p = Vector2.MoveTowards(transform.position, dest, speed);
    GetComponent<Rigidbody2D>().MovePosition(p);

    // Check for Input if not moving
    if ((Vector2)transform.position == dest)
    {
        if (Input.GetKey("w") )
            dest = (Vector2)transform.position + Vector2.up;
        if (Input.GetKey("d"))
            dest = (Vector2)transform.position + Vector2.right;
        if (Input.GetKey("s"))
            dest = (Vector2)transform.position - Vector2.up;
        if (Input.GetKey("a"))
            dest = (Vector2)transform.position - Vector2.right;
    }

}
}

1 Ответ

0 голосов
/ 06 января 2019

У вас есть пара вещей, которые вы должны остерегаться.

1) Вы никогда не сбрасываете "dest" в любом месте своего кода. По мере того как вы двигаетесь на основе расчета, установленного на «р». Я полагаю, что ваш персонаж ударяет о стену, которая находится настолько близко, насколько это возможно, к "dest", поэтому она не может двигаться ближе. Я не могу предсказать, что вы пытаетесь сделать своим геймплеем, но я думаю, вы захотите сбросить «dest» в OnCollision (), чтобы объект двигался, а не смотрел на стену.

Как общий совет, я бы не стал устанавливать PacMac (управляемый игроком юнит) на пункт назначения. Вы хотели бы рассчитать смещение на основе входных данных, а затем попытаться добавить его в transform.position (возможно, безопаснее с помощью системы RigidBody), а затем позволить моделированию перейти оттуда.

2) Вы движетесь без привязки к игровому времени. Вы должны действительно изменить свое смещение, чтобы оно рассчитывалось с учетом Time.deltaTime. Это важно, если вы работаете на быстром или медленном компьютере. С вашим текущим кодом вы будете двигаться намного быстрее на сильном компьютере и медленнее на медленном компьютере.

3) Исходя из вашего опыта pacman, вы можете изменить их на операторы if if. Еще лучше, но сложнее, принять только последний вход. Это не даст вам двигаться по диагонали (к чему ваш текущий код подвержен. Если вы сделаете второй метод, вам нужно будет сохранить стек всех нажатых кнопок на случай, если кто-то попытается удерживать несколько кнопок одновременно.

...