当前位置: 首页 > article >正文

unity下添加c#脚本

unity下添加c#脚本

  • 创建脚本文件的方式
    • 1. 创建脚本
    • 2. 附加脚本到游戏对象
  • 脚本常用的生命周期方法
    • 1. Awake
    • 2. Start
    • 3. Update
    • 4. FixedUpdate
    • 5. LateUpdate
  • 使用脚本控制游戏对象
    • 1. 访问游戏对象的组件
    • 2. 访问其他游戏对象
    • 3. 变换组件
  • 完整示例(创建一个简单的移动脚本)
  • 计算每s帧率的代码
    • 示例
    • 代码解释

创建脚本文件的方式

在unity中,C#脚本是通过将脚本组件附加到游戏对象(gameobject)上实现的,脚本组件可以用来处理游戏对象的行为和逻辑

1. 创建脚本

  • 右键点击项目窗口中的Assets,选择Create -> C# script
    在这里插入图片描述

  • 每个脚本必须继承自MonoBehaviour类,并且至少包含一个Update方法(或其他unity生命周期方法)
    示例:

using UnityEngine;

public class MyScript : MonoBehaviour
{
    //Start方法:初始化
    void Start()
    {
        Debug.Log("脚本已初始化");
    }
    
    //Update方法:每帧调用
    void Update()
    {
        //这里编写每帧执行的逻辑
        Debug.Log("每帧执行的逻辑");
    }
}

2. 附加脚本到游戏对象

  • 在检视面板(Inspector)中,点击Add Component,在搜索框中输入脚本名称,选择脚本并添加到游戏对象上

脚本常用的生命周期方法

1. Awake

  • 在脚本实例化时调用,无论脚本是否启用,在Start之前执行
  • 常用于初始化对象之间的引用和设置
void Awake()
{
    Debug.Log("脚本已实例化");
}

2. Start

  • 在脚本首次启动用时调用一次,且在Update方法之前
  • 常用于初始化依赖于Awake方法设置的逻辑
void Start()
{
    Debug.Log("脚本已初始化");
}

3. Update

  • 每帧调用,适用于非物理相关的逻辑
  • 常用于输入检测、位置更新、动画控制等
void Update()
{
    Debug.Log("每帧执行的逻辑");
}

4. FixedUpdate

  • 以固定的时间步长调用,适用于物理相关的逻辑
  • 常用于物理引擎交互、刚体控制等
void FixedUpdate()
{
    Debug.Log("固定时间步长执行的逻辑");
}

5. LateUpdate

  • 在Update方法之后调用,适用于需要再Update方法之后执行的逻辑
  • 常用于摄像机跟随,动画后处理等
void LateUpdate()
{
    Debug.Log("在Update 之后执行的逻辑");
}

使用脚本控制游戏对象

1. 访问游戏对象的组件

  • 通过GetComponent方法获取游戏对象上的其他组件
//获取刚体组件
Rigidbody rb = GetComponent<Rigidbody>();

//应用力
rb.AddForce(Vector3.up * 10.0f);

2. 访问其他游戏对象

  • 使用GameObject.Find方法或通过引用其他脚本中的公共变量来访问其他游戏对象
//通过名称查找游戏对象
GameObject target = GameObject.Find("TargetObject");

//通过标签查找游戏对象
GameObject player = GameObject.FindWithTag("Player");

3. 变换组件

  • 使用transform组件来更改游戏对象的位置、旋转和缩放
//移动游戏对象
transform.Translate(Vector3.forward * Time.deltaTime * 5.0f);

//旋转游戏对象
transform.Rotate(Vector3.up, Time.deltaTime * 30.0f);

完整示例(创建一个简单的移动脚本)

using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
    public float speed = 5.0f;
    
    void Update()
    {
        //获取水平输入
        float moveHorizontal = Input.GetAxis("Horizontal");
        
        //获取垂直输入
        float moveHorizontal = Input.GetAxis("Vertical");
        
        //创建移动向量
        Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);
        
        //应用移动
        transform.Translate(movement * Time.deltaTime * speed);
    }
}

计算每s帧率的代码

可通过Update方法计算并显示每秒频率(FPS),帧率是指每秒显示的帧数,可反映游戏运行的流畅度

示例

using UnityEngine;

public class FPSCounter : MonoBehaviour
{
    private float deltaTime = 0.0f;
    
    void Update()
    {
        //计算每一帧的时间
        deltaTime += (Time.unscaledDeltaTime - deltaTime) * 0.1f;
    }
    
    void OnGUI()
    {
        //计算帧率
        float fps = 1.0f / deltaTime;
        
        //格式化显示频率
        GUIStyle style = new GUIStyle();
        style.fontSize = 36;
        style.normal.textColor = Color.White;
        
        //在屏幕左上角显示帧率
        Rect rect = new Rect(10, 10, 100, 20);
        GUI.Label(rect, $"FPS: {Mathf.Round(fps)}", style);
    }
}

代码解释

  1. deltaTime:用于存储每帧时间的变量,Time.unscaledDeltaTime 返回每帧的时间间隔(以秒为单位),不受 Time.timeScale 的影响
  2. Update 方法:在每一帧中,可更新 deltaTime 的值,通过使用一个平滑因子(0.1f),可使帧率的计算更加平滑
  3. OnGUI 方法:用于在屏幕上绘制 GUI 元素的方法,可计算帧率并将其显示在屏幕的左上角
  4. 帧率计算:float fps = 1.0f / deltaTime; 通过计算 deltaTime 的倒数来获取当前帧率
  5. GUI 显示:使用 GUI.Label 方法在屏幕上显示帧率,GUIStyle 用于设置文本的字体大小和颜色

http://www.kler.cn/a/388782.html

相关文章:

  • PostgreSQL 开启密码验证插件
  • OpenGL【C++】台灯
  • 工业相机选取
  • 矩阵的各种计算:乘法、逆矩阵、转置、行列式等——基于Excel实现
  • 利用 Screen 保持 VSCode 连接远程任务持续运行
  • 【leetcode练习·二叉树】用「分解问题」思维解题 II
  • Seldon Core大模型部署详解
  • 如何在vscode中安装git详细新手教程
  • 快速上手 muduo
  • 【iOS】知乎日报第三周总结
  • 金融市场中的量化分析:正大科技如何赋能投资者决策
  • 期权懂|你知道期权策略有哪些核心策略吗?
  • 保护Kubernetes免受威胁:容器安全的有效实践
  • 力扣力扣力:动态规划入门(1)
  • solo博客使用非docker方式进行https部署
  • Android 文件带进度的下载功能实现与封装
  • 2024年11月6日Github流行趋势
  • 【计网不挂科】计算机网络期末考试——【选择题&填空题&判断题&简述题】试卷(2)
  • 蓝桥杯:编程爱好者的试炼场
  • 运维的目标管理:以业务为核心,驱动运维价值最大化
  • 实时高效,全面测评快递100API的物流查询功能
  • 基于单片机洗衣机控制器的设计(论文+源码)
  • BMC运维管理:IPMI实现服务器远控制
  • 笔记整理—linux驱动开发部分(10)input子系统与相关框架
  • 计算机毕业设计 | SpringBoot社区物业管理系统(附源码)
  • 使用Golang实现开发中常用的【实例设计模式】