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;
    }
}
posted @   我帝波罗  阅读(47)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示