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 @ 2023-02-26 20:45  我帝波罗  阅读(67)  评论(0)    收藏  举报