2D项目中控制角色移动(按帧率)
1.不涉及物理效果
using UnityEngine;
public class ControlScripts : MonoBehaviour
{
// 将速度暴露出来,使其可调
public float speed = 0.1f;
// 每帧调用一次 Update
void Update()
{
// 固定写法,获取当前水平轴的输入
float horizontal = Input.GetAxis("Horizontal");
// 固定写法,获取当前垂直轴的输入
float vertical = Input.GetAxis("Vertical");
// 获取当前2D对象的坐标(x,y)保存到变量position中
Vector2 position = transform.position;
// 当前坐标+速度*水平轴输入*每一帧渲染需要的时间(按帧率来计算位移距离确保不同帧率的情况下位移距离一致)然后赋值给当前对象的x坐标
position.x = position.x + speed * horizontal * Time.deltaTime;
// 同上
position.y = position.y + speed * vertical * Time.deltaTime;
// 把更改后的坐标重新赋值给当前2D对象 实现位移
transform.position = position;
}
}
2.有物理效果(碰撞)去除碰撞颤抖
using UnityEngine;
public class ControlScripts : MonoBehaviour
{
// 声明一个刚体对象
Rigidbody2D rigidbody2D;
public float horizontal;
public float vertical;
public float speed = 0.1f;
private void Start()
{
rigidbody2D = GetComponent<Rigidbody2D>();
}
// 每帧调用一次 Update
void Update()
{
// 固定写法,获取当前水平轴的输入
horizontal = Input.GetAxis("Horizontal");
// 固定写法,获取当前垂直轴的输入
vertical = Input.GetAxis("Vertical");
}
// 按固定时间间隔刷新
private void FixedUpdate()
{
// 获取当前2D对象的坐标(x,y)
Vector2 position = transform.position;
// 当前坐标+速度*水平轴输入*每一帧渲染需要的时间(按帧率来计算位移距离确保不同帧率的情况下位移距离一致)然后赋值给当前对象的x坐标
position.x = position.x + speed * horizontal * Time.deltaTime;
// 同上
position.y = position.y + speed * vertical * Time.deltaTime;
// 把更改后的坐标重新赋值给当前2D刚体对象 实现位移(这种方式碰撞不会颤抖)
rigidbody2D.position = position;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了