前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Unity3D】Unity 游戏画面帧更新 ( 游戏物体 GameObject 移动 | 借助 Time.deltaTime 进行匀速运动 )

【Unity3D】Unity 游戏画面帧更新 ( 游戏物体 GameObject 移动 | 借助 Time.deltaTime 进行匀速运动 )

作者头像
韩曙亮
发布2023-03-30 17:55:16
7920
发布2023-03-30 17:55:16
举报
文章被收录于专栏:韩曙亮的移动开发专栏

文章目录

一、 游戏物体 GameObject 移动


在 Unity 中 , 如果想要让 游戏物体 GameObject 移动 , 则需要在 MonoBehaviour#Update() 函数 中 , 不断的修改 物体的 Transform#localPosition 坐标位置 ;

在 MonoBehaviour#Start() 函数 中 , 先 设置游戏的帧率 , 为了方便计算 , 这里设置 50 fps ;

代码语言:javascript
复制
        // 设置游戏更新帧率 50 fps
        Application.targetFrameRate = 50;

在 MonoBehaviour#Update() 函数 中 , 进行如下画面更新操作 , 每次更新画面帧时 , 计算 游戏场景 中的 游戏物体 的运行位置 , 然后设置给游戏物体 ;

首先 , 获取当前 游戏物体 GameObject 的本地坐标 , 赋值给 Vector3 类型的变量 ;

代码语言:javascript
复制
        // 获取 物体的 当前位置 本地坐标
        Vector3 localPosition = this.transform.localPosition;

然后 , 将 坐标的 x 分量自增 0.02f , 之前设置游戏帧率 50fps, 也就是每秒移动 1 米距离 ;

代码语言:javascript
复制
        // 坐标的 x 分量自增 0.02f , 之前设置游戏帧率 50fps, 也就是每秒移动 1 米距离
        localPosition.x += 0.02f;

最后 , 将修改后的坐标设置回去 ;

代码语言:javascript
复制
        // 将坐标设置回去 , 更新物体的位置
        this.transform.localPosition = localPosition;

完整代码如下 :

代码语言:javascript
复制
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BehaviourScript : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        // 打印日志
        Debug.Log("Unity 脚本入口 , 启动加载时调用");

        // 设置游戏更新帧率 50 fps
        Application.targetFrameRate = 50;

        // 获取当前组件附着的 游戏物体 GameObject
        GameObject gameObject = this.gameObject;

        // 获取当前组件附着的 游戏物体 GameObject 名称
        string name = gameObject.name;
        Debug.Log("C# 脚本附着游戏物体的名称 : " + name);

        // 获取当前组件附着的 游戏物体 GameObject 的 Transform 组件
        Transform transform = gameObject.transform;

        // 获取 Transform 组件的 位置 , 旋转量 , 缩放倍数 
        Debug.Log("C# 脚本附着游戏物体的 Transform 组件数据 位置 : " + transform.position 
            + " , 旋转量 : " + transform.rotation + " , 缩放倍数 : " + transform.localScale);

        // 将 当前组件附着的 游戏物体 GameObject 移动到 (4.0f, 4.0f, 4.0f) 坐标位置
        //this.transform.localPosition = new Vector3(4.0f, 4.0f, 4.0f);

    }

    // Update is called once per frame
    void Update()
    {
        Debug.Log("C# 脚本 Update 函数调用 , 游戏帧更新 , 当前游戏时间 : " + Time.time + " , 本次更新距离上次更新时间差 : " + Time.deltaTime);

        // 将 当前组件附着的 游戏物体 GameObject 沿 X 轴方向移动
        // 获取 物体的 当前位置 本地坐标
        Vector3 localPosition = this.transform.localPosition;
        // 坐标的 x 分量自增 0.02f , 之前设置游戏帧率 50fps, 也就是每秒移动 1 米距离
        localPosition.x += 0.02f;
        // 将坐标设置回去 , 更新物体的位置
        this.transform.localPosition = localPosition;
    }
}

运行效果 :

初始状态 :

在这里插入图片描述
在这里插入图片描述

运行一段时间后 :

在这里插入图片描述
在这里插入图片描述

二、 借助 Time.deltaTime 进行匀速运动


上述游戏物体运动 , 不是匀速运动 , 每次在 MonoBehaviour#Update() 函数 中 , 累加一个固定值 , 但是 该函数调用的间隔不是固定的 , 因此该运动不是匀速运动 ;

如果将该运动设置为匀速运动 , 可以 设置一个固定的速度值 , 根据 通过 Time.deltaTime 代码 获取的 本次更新与上一次更新的时间差 , 计算出本次应该移动多少距离 ;

将固定速度值设为 1 米 / 秒 ;

完整代码如下 :

代码语言:javascript
复制
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BehaviourScript : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        // 打印日志
        Debug.Log("Unity 脚本入口 , 启动加载时调用");

        // 设置游戏更新帧率 50 fps
        Application.targetFrameRate = 50;

        // 获取当前组件附着的 游戏物体 GameObject
        GameObject gameObject = this.gameObject;

        // 获取当前组件附着的 游戏物体 GameObject 名称
        string name = gameObject.name;
        Debug.Log("C# 脚本附着游戏物体的名称 : " + name);

        // 获取当前组件附着的 游戏物体 GameObject 的 Transform 组件
        Transform transform = gameObject.transform;

        // 获取 Transform 组件的 位置 , 旋转量 , 缩放倍数 
        Debug.Log("C# 脚本附着游戏物体的 Transform 组件数据 位置 : " + transform.position 
            + " , 旋转量 : " + transform.rotation + " , 缩放倍数 : " + transform.localScale);

        // 将 当前组件附着的 游戏物体 GameObject 移动到 (4.0f, 4.0f, 4.0f) 坐标位置
        //this.transform.localPosition = new Vector3(4.0f, 4.0f, 4.0f);

    }

    // Update is called once per frame
    void Update()
    {
        Debug.Log("C# 脚本 Update 函数调用 , 游戏帧更新 , 当前游戏时间 : " + Time.time + " , 本次更新距离上次更新时间差 : " + Time.deltaTime);

        // 将 当前组件附着的 游戏物体 GameObject 沿 X 轴方向移动
        // 获取 物体的 当前位置 本地坐标
        Vector3 localPosition = this.transform.localPosition;
        // 计算移动的距离
        // 速度设置为 1 单位 / 秒
        float speed = 1f;
        // 计算长度 , 速度 乘以 距离上次帧更新的时间差
        float distance = speed * Time.deltaTime;
        // 匀速运动值
        localPosition.x += distance;
        // 将坐标设置回去 , 更新物体的位置
        this.transform.localPosition = localPosition;
    }
}

初始状态 :

在这里插入图片描述
在这里插入图片描述

运行一段时间后 :

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-11-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、 游戏物体 GameObject 移动
  • 二、 借助 Time.deltaTime 进行匀速运动
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档