Unity游戏开发——Unity脚本组件:游戏开发的灵魂

news2024/9/23 17:25:27

Unity游戏开发


“好读书,不求甚解;每有会意,便欣然忘食。”

本文目录:

Unity游戏开发

  • Unity游戏开发
  • Unity脚本组件:游戏开发的灵魂
  • 前言
    • 1.Standard Assets导入报错解决办法
    • 2. 什么是Unity脚本组件?
    • 3. 创建和使用脚本组件
      • 3.1 创建脚本
      • 3.2 附加脚本到游戏对象
    • 4. 理解Unity脚本的生命周期方法
    • 5. 常见的脚本组件示例
      • 5.1 角色移动脚本
      • 5.2 简单的摄像机跟随脚本
    • 6. 优化和组织脚本代码
      • 6.1 减少`Update`调用
      • 6.2 模块化代码
      • 6.3 使用脚本的公共接口
  • 总结


Unity脚本组件:游戏开发的灵魂

前言

ok兄弟们。今天我又来啦。
一天不见,甚是想念!
昨天我们一起看了unity中的地形的创建,但是我今天发现,由于我们学习时下使用的Standard Assets 太老了,会报错
解决方法在正文给出了大家。今天一起来看一下unity的脚本组件吧~


以下是本篇文章正文内容


1.Standard Assets导入报错解决办法

我们只需要将ForceReset.cs 脚本
替换为:

using System;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityStandardAssets.CrossPlatformInput;
using UnityEngine.UI;
 
[RequireComponent(typeof (Image))]
public class ForcedReset : MonoBehaviour
{
    private void Update()
    {
        // if we have forced a reset ...
        if (CrossPlatformInputManager.GetButtonDown("ResetObject"))
        {
            //... reload the scene
            SceneManager.LoadScene(SceneManager.GetSceneAt(0).name);
        }
    }
}

以及将SimpleActivatorMenu.cs 脚本替换为:

using System;
using UnityEngine;
using UnityEngine.UI;
 
namespace UnityStandardAssets.Utility
{
    public class SimpleActivatorMenu : MonoBehaviour
    {
        // An incredibly simple menu which, when given references
        // to gameobjects in the scene
        public Text camSwitchButton;
        public GameObject[] objects;
 
 
        private int m_CurrentActiveObject;
 
 
        private void OnEnable()
        {
            // active object starts from first in array
            m_CurrentActiveObject = 0;
            camSwitchButton.text = objects[m_CurrentActiveObject].name;
        }
 
 
        public void NextCamera()
        {
            int nextactiveobject = m_CurrentActiveObject + 1 >= objects.Length ? 0 : m_CurrentActiveObject + 1;
 
            for (int i = 0; i < objects.Length; i++)
            {
                objects[i].SetActive(i == nextactiveobject);
            }
 
            m_CurrentActiveObject = nextactiveobject;
            camSwitchButton.text = objects[m_CurrentActiveObject].name;
        }
    }
}

其他的报错直接清除即可。
感谢https://haiyue.blog.csdn.net/?type=blog海月大佬提供的解决办法
大家可以多多关注。

2. 什么是Unity脚本组件?

Unity中的脚本组件是附加到游戏对象(GameObject)上的自定义脚本,通常使用C#编写。它允许开发者定义对象的行为,比如移动、交互、物理效果等。脚本组件和Unity的内置组件(如Rigidbody、Collider等)协同工作,共同驱动游戏的运行。
比如摄像头功能:
在这里插入图片描述
在这里插入图片描述

3. 创建和使用脚本组件

3.1 创建脚本

在Unity中创建脚本非常简单。我们可以右键单击项目窗口中的任意文件夹,选择“Create -> C# Script”,并为脚本命名。创建后的脚本会自动生成一个基本的C#类文件,继承自MonoBehaviour

using UnityEngine;

public class MyScript : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

3.2 附加脚本到游戏对象

将脚本附加到游戏对象的方法有两种:

  1. 拖放法:直接将脚本从项目窗口拖放到场景中的游戏对象或层级视图中的对象上。
  2. Add Component法:在检视面板中点击“Add Component”,然后在列表中找到或搜索你的脚本。

4. 理解Unity脚本的生命周期方法

Unity中的脚本组件有几个重要的生命周期方法,每个方法在游戏运行的不同阶段被调用。理解这些方法的调用时机,有助于更好地控制游戏逻辑。

  • Awake():在脚本实例化后立即调用,通常用于初始化依赖对象或变量。
  • Start():在Awake之后调用,并且仅在第一次更新帧之前调用,适用于在游戏开始时的初始化操作。
  • Update():每帧调用一次,通常用于处理游戏对象的动态行为,如移动和旋转。
  • FixedUpdate():按照固定的时间间隔调用,主要用于处理物理相关的计算。
  • LateUpdate():在所有的Update方法调用后执行,适用于需要在更新逻辑完成后进行的操作,如摄像机跟随。

5. 常见的脚本组件示例

5.1 角色移动脚本

using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
    public float speed = 5f;

    void Update()
    {
        float moveX = Input.GetAxis("Horizontal") * speed * Time.deltaTime;
        float moveZ = Input.GetAxis("Vertical") * speed * Time.deltaTime;

        transform.Translate(new Vector3(moveX, 0, moveZ));
    }
}

这个脚本允许玩家通过键盘的箭头键或WASD键来控制角色的移动。Input.GetAxis方法用来获取玩家的输入,Translate方法则是将输入转化为游戏对象的移动。

5.2 简单的摄像机跟随脚本

using UnityEngine;

public class CameraFollow : MonoBehaviour
{
    public Transform target;
    public float smoothSpeed = 0.125f;
    public Vector3 offset;

    void LateUpdate()
    {
        Vector3 desiredPosition = target.position + offset;
        Vector3 smoothedPosition = Vector3.Lerp(transform.position, desiredPosition, smoothSpeed);
        transform.position = smoothedPosition;

        transform.LookAt(target);
    }
}

此脚本实现了摄像机跟随目标对象的功能。LateUpdate确保摄像机的跟随是在所有对象的移动都处理完毕后进行,以保证平滑的跟随效果。
在这里插入图片描述
我们可以创建一个C#脚本来体验一下:
右键 ——创建 —— C#脚本
在这里插入图片描述

双击打开进行编辑
在这里插入图片描述
输入我们的代码
在这里插入图片描述
添加我们刚刚制作的脚本组件
在这里插入图片描述
选择我们的目标,这样就实现了简单的摄像机跟随。

6. 优化和组织脚本代码

6.1 减少Update调用

尽可能减少Update方法中的代码逻辑,尤其是复杂运算。可以通过事件驱动的方式或结合协程(Coroutine)来优化性能。

6.2 模块化代码

将重复的代码逻辑提取为独立的函数或类,使脚本更具可读性和可维护性。尤其在大型项目中,良好的代码组织至关重要。

6.3 使用脚本的公共接口

通过使用公共接口来管理脚本之间的交互,减少耦合。例如,使用接口来定义可以被多个脚本调用的通用方法。


总结

文章总结:

Unity脚本组件是游戏开发者的得力工具,它不仅赋予了游戏对象动态的行为,还提供了丰富的开发潜力。
有了这个,你才能让物体或者游戏中的对象按需做事。
从理解脚本的基本结构到掌握生命周期方法,再到实际应用中的常见示例,这些都是构建高质量游戏的重要步骤,是游戏开发的灵魂。
希望大家多多交流,有错误的地方,敬请指出。
我们下一篇文章再见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2074429.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue 精选评论词云 集成echarts-wordcloud TF-IDF算法

这一期在我们的系统里集成词云组件&#xff0c;开发的功能是景区精选评论的词云展示功能。 这个界面的逻辑是这样的&#xff1a; 在数据框里输入城市&#xff0c;可以是模糊搜索的&#xff0c;选择城市&#xff1b; 选择城市后&#xff0c;发往后台去查询该城市的精选评论&a…

python,json数据格式,pyecharts模块,pycharm中安装pyecharts

json数据格式 JSON是一种轻量级的数据交互格式 可以按照JSON指定的格式去组织和封装数据 JSON本质上是一个带有特定格式的字符串 主要功能&#xff1a; json就是一种在各个编程语言中流通的数据格式&#xff0c;负责不同编程语言中的数据传递和交互. 类似于&#xff1a; 国…

P39-数据存储2

编程题 编程题 编程题

2024 年顶级 Flutter UI 框架和库

根据 2022 年 StackOverflow 调查显示&#xff0c;Flutter 是最受欢迎的跨平台工具之一。自发布以来的 16 个月内&#xff0c;已有超过 200 万开发者采用了 Flutter。在本博客中&#xff0c;我们将浏览 GitHub 上可用的顶级 Flutter 存储库。除了每个存储库之外&#xff0c;还提…

MySQL 系统学习系列 - 事务、视图与存储过程的使用《MySQL系列篇-06》

数据库事务、视图、存储过程 事务 1. 事务简介 事务&#xff08;transaction&#xff09;是指访问并更新数据库中各种数据的一个程序执行单元&#xff08;unit&#xff09; [最小执行单元] MySQL事务主要用于处理操作量大。复杂度高的数据 1.MySQL数据库只有InnoDB引擎支持事…

App应用冷启动耗时排查

1 查看冷启动耗时 adb shell am start -S -W com.gerry.lifecycle/com.gerry.lifecycle.MainActivity发现冷启动耗时居然要6s多&#xff0c;下面开始排查 2 生成trace文件 // Application中开始trace记录 override fun attachBaseContext(base: Context?) {super.attachBas…

虚幻5|简单的设置角色受到伤害,远程攻击机关设置,制作UI,低血量UI

虚幻5|制作玩家血量&#xff0c;体力&#xff08;还未编辑&#xff0c;只用于引用&#xff09;-CSDN博客 需完成制作玩家血量及体力部分 一.给角色添加死亡动画 1.为了保证角色在播放死亡蒙太奇的时候&#xff0c;不会重新播放&#xff0c;而是保持原来倒地的姿势&#xff0…

Renesa Version Board开发RT-Thread 之WIFI创建Client

概述 本文主要介绍使用Renesa Version Board中WIFI功能&#xff0c;该模块基于RW007模块设计&#xff0c;RT-Thread软件架构已经实现该硬件相关的驱动接口。笔者基于该模块的相关接口在LWIP软件框架的基础上实现Client功能。实现数据的发送和接收。 1 WLAN 框架简介 参考文档…

【Java】—— Java面向对象基础:使用Java创建和打印员工对象信息

在Java中&#xff0c;类的定义和使用是面向对象编程的核心。本文将通过一个简单的例子来展示如何定义一个员工类&#xff08;Employee&#xff09;&#xff0c;并在测试类中创建员工对象&#xff0c;为这些对象的属性赋值&#xff0c;并打印出它们的信息。 定义员工类&#xff…

大模型微调

文章目录 前言一、使用的库二、数据预处理1.引入库2.读入数据3.对数据进行预处理4.转换为json格式文件 三&#xff0c;使用算子分析数据并进行数据处理四&#xff0c;划分训练集和测试集五&#xff0c;编写训练脚本开始训练六&#xff0c;进行模型推理人工评估总结 前言 这是使…

网络优化|单源最短路|Dijkstra|Floyd|Matlab

图和网络可以用来描述集合元素和元素之间关系。大量的最优化问题都可以抽象为网络模型加以解释&#xff0c;描述和求解。 图与网络模型在建模时具有直观、易理解、适应性强等&#xff0c;广泛应用在管理科学、物理学、化学、计算机科学、信息论、控制论、社会科学以及军事科学等…

C# 循环访问目录树详解与示例

文章目录 一、目录树遍历的概念二、使用System.IO命名空间三、DirectoryInfo和FileInfo类四、递归遍历目录树五、示例&#xff1a;列出目录树中的所有文件和文件夹六、异常处理七、迭代方法八、总结 在C#中&#xff0c;访问文件系统是常见的需求之一。有时我们需要遍历目录树以…

嵌入式开发技术进步带来新机遇

嵌入式开发作为信息技术领域的重要分支&#xff0c;随着科技的不断进步&#xff0c;正迎来新的机遇。本文将从人工智能、物联网、边缘计算等方面探讨嵌入式开发技术的进步如何带来新的发展机遇&#xff0c;并展望未来的发展趋势。 一、引言 嵌入式系统是一种特殊的计算机系统&…

unreal engine5中character角色和怪物交互时发生穿模

UE5系列文章目录 文章目录 UE5系列文章目录前言一、原因定位二、解决方法 前言 在 Unreal Engine 5 中&#xff0c;角色“穿模”通常指的是角色模型与其他物体&#xff08;如墙壁、地面或其他对象&#xff09;发生不正确的穿透或重叠现象。这可能是由多种原因造成的&#xff0…

C++ | Leetcode C++题解之第372题超级次方

题目&#xff1a; 题解&#xff1a; class Solution {const int MOD 1337;int pow(int x, int n) {int res 1;while (n) {if (n % 2) {res (long) res * x % MOD;}x (long) x * x % MOD;n / 2;}return res;}public:int superPow(int a, vector<int> &b) {int an…

C# 泛型类型的约束详解与示例

文章目录 一、泛型约束概述二、泛型约束详解与示例1. 类约束2. 接口约束3. 引用类型约束4. 值类型约束5. 无参数构造函数约束6、多重约束7、默认构造函数约束8、基类和接口的组合约束 三、总结 在C#编程语言中&#xff0c;泛型是一种非常强大的特性&#xff0c;它允许我们编写可…

NetSuite 2024.2 学习笔记

NetSuite一年两次的发版&#xff0c;每次都会带来一些新的东西。这对于顾问来说&#xff0c;应该成为必修课。 每个版本发版内容的学习时长&#xff0c;大约在20小时左右。包括&#xff1a; •Release Notes通读 •Release Preview环境申请 •热点功能验证 •New Release学习笔…

vue中video视频路径改变,dom不更新问题

效果展示 视频切换前 视频切换后 完整代码 <template><!-- 设置v-if只在路径有值时&#xff0c;标签才存在 --><video v-if"state.videoSrc ! null" controls><source :src"state.videoSrc" type"video/mp4"></…

Java | Leetcode Java题解之第372题超级次方

题目&#xff1a; 题解&#xff1a; class Solution {static final int MOD 1337;public int superPow(int a, int[] b) {int ans 1;for (int e : b) {ans (int) ((long) pow(ans, 10) * pow(a, e) % MOD);}return ans;}public int pow(int x, int n) {int res 1;while (n…

Pytorch实现CIFAR10训练模型

文章目录 简述模型结构模型参数、优化器、损失函数参数初始化优化器损失函数 模型训练、测试集预测、模型保存、日志记录训练测试集测试模型保存模型训练完整代码 tensorboard训练可视化结果train_loss测试准确率测试集loss 模型应用模型独立应用代码api.py预测结果 简述 使用…