c# - 角色触墙后无法移动
问题描述
我正在使用在线教程制作 pacman 克隆。我刚刚了解了 pacman 的运动,当 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)您永远不会在代码中的任何地方重置“dest”。当您根据设置为“p”的计算移动时。我想你的角色正在撞墙,它尽可能靠近“dest”,因此它不能再靠近了。我无法预测你想让你的游戏玩法是什么,但我想你想在 OnCollision() 中重置“dest”以保持对象移动而不是盯着墙壁。
作为一般建议,我不会将 PacMac(玩家控制的单元)设置为前往目的地。您想根据输入计算偏移量,然后尝试将其添加到 transform.position (通过 RigidBody 系统可能更安全),然后让模拟从那里接管。
2)你在没有任何参考游戏时间的情况下移动。您应该真正更改要计算的偏移量,并考虑 Time.deltaTime 。这对于在快速计算机或慢速计算机上运行时很重要。使用您当前的代码,您将在强大的计算机上移动得更快,而在慢速计算机上移动得更慢。
3) 根据您的 pacman 经验,您可能希望将这些更改为 else if 语句。更好,但更难,只接受最后一个输入。这将防止您沿对角线移动(您当前的代码很容易受到这种影响。如果您执行第二种方法,您将希望保留所有按钮的堆栈,以防有人试图同时按住多个按钮。
推荐阅读
- c++ - 如何将 std::cin 传递给类构造函数?
- react-native - React native expo 应用程序因未实现的错误而中断
- r - semi_join 和 anti_join 函数创建 dtplyr 对象而不是数据帧
- python - 以指定格式填充缺失值
- python - Django DateField:输入没有年份的日期来表示今年
- python - 气流 DAG 使用 PythonOperator 失败并出现“`python_callable` 参数必须是可调用的”异常
- reactjs - 如何理解 useRef() 和 AnimateFrame 部分的使用
- c++ - 按大小拆分 wchar_t
- mysql - 如何解决这个 mysql 错误 #1093 - You can't specify target table 'person' for update in FROM 子句
- sql - 是否可以使用 SDK 区分基于 Cognos SQL 的报告和基于多维数据集/包的报告?