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

Unity游戏开发


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

本文目录:

Unity游戏开发

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

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

前言

ok兄弟们。今天我又来啦。

一天不见,甚是想念!

昨天我们一起看了unity中的地形的创建,但是我今天发现,由于我们学习时下使用的Standard Assets 太老了,会报错

解决方法在正文给出了大家。今天一起来看一下unity的脚本组件吧~


以下是本篇文章正文内容


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

我们只需要将ForceReset.cs 脚本

替换为:

csharp 复制代码
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 脚本替换为:

csharp 复制代码
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

csharp 复制代码
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 角色移动脚本

csharp 复制代码
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 简单的摄像机跟随脚本

csharp 复制代码
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脚本组件是游戏开发者的得力工具,它不仅赋予了游戏对象动态的行为,还提供了丰富的开发潜力。

有了这个,你才能让物体或者游戏中的对象按需做事。

从理解脚本的基本结构到掌握生命周期方法,再到实际应用中的常见示例,这些都是构建高质量游戏的重要步骤,是游戏开发的灵魂。

希望大家多多交流,有错误的地方,敬请指出。

我们下一篇文章再见!

相关推荐
June bug6 小时前
【领域知识】休闲游戏一次发版全流程:Google Play + Apple App Store
unity
星夜泊客8 小时前
C# 基础:为什么类可以在静态方法中创建自己的实例?
开发语言·经验分享·笔记·unity·c#·游戏引擎
dzj20219 小时前
PointerEnter、PointerExit、PointerDown、PointerUp——鼠标点击物体,则开始旋转,鼠标离开或者松开物体,则停止旋转
unity·pointerdown·pointerup
心前阳光10 小时前
Unity 模拟父子关系
android·unity·游戏引擎
在路上看风景13 小时前
26. Mipmap
unity
咸鱼永不翻身15 小时前
Unity视频资源压缩详解
unity·游戏引擎·音视频
在路上看风景15 小时前
4.2 OverDraw
unity
在路上看风景16 小时前
1.10 CDN缓存
unity
ellis19701 天前
Unity插件SafeArea Helper适配异形屏详解
unity
nnsix1 天前
Unity Physics.Raycast的 QueryTriggerInteraction枚举作用
unity·游戏引擎