unity学习第1天

news2024/11/18 1:48:28

本身也具有一些unity知识,包括Eidtor界面使用、Shader效果实现、性能分析,但对C#、游戏逻辑不太清楚,这次想从开发者角度理解游戏,提高C#编程,从简单的unity游戏理解游戏逻辑,更好的为工作服务。

unity2019.4.40f1c1,使用Unity官网FPS Microgame(如下图)。原本想从游戏源码启动流程开始学习,但Unity核心代码没有开源,就还是先理解游戏逻辑。

游戏分成 5个Scene,我们关注MainScene,其中有个GameManager,从Inspector看挂有许多Scripts,我们先一个个分析。

 GameFlowManager,引用using UnityEngine.SceneManagement,定义类GameFlowManager前半部分是在自定义Eidtor界面,这里float timeRatio = 1 - (m_TimeLoadEndGameScene - Time.time) / endSceneLoadDelay;不是很理解,待续

using UnityEngine;
using UnityEngine.SceneManagement;

public class GameFlowManager : MonoBehaviour
{
    [Header("Parameters")]
    [Tooltip("Duration of the fade-to-black at the end of the game")]
    public float endSceneLoadDelay = 3f;
    [Tooltip("The canvas group of the fade-to-black screen")]
    public CanvasGroup endGameFadeCanvasGroup;

    [Header("Win")]
    [Tooltip("This string has to be the name of the scene you want to load when winning")]
    public string winSceneName = "WinScene";
    [Tooltip("Duration of delay before the fade-to-black, if winning")]
    public float delayBeforeFadeToBlack = 4f;
    [Tooltip("Duration of delay before the win message")]
    public float delayBeforeWinMessage = 2f;
    [Tooltip("Sound played on win")]
    public AudioClip victorySound;
    [Tooltip("Prefab for the win game message")]
    public GameObject WinGameMessagePrefab;

    [Header("Lose")]
    [Tooltip("This string has to be the name of the scene you want to load when losing")]
    public string loseSceneName = "LoseScene";


    public bool gameIsEnding { get; private set; }

    PlayerCharacterController m_Player;
    NotificationHUDManager m_NotificationHUDManager;
    ObjectiveManager m_ObjectiveManager;
    float m_TimeLoadEndGameScene;
    string m_SceneToLoad;

    void Start()
    {   
        Debug.Log("Start Game: " + m_Player);
        //返回场景中的所填类型的随机个体
        m_Player = FindObjectOfType<PlayerCharacterController>();
        //DebugUtility.cs不是Unity中的内置脚本,存在Assets/FPS/Scripts/DebugUtility.cs
        DebugUtility.HandleErrorIfNullFindObject<PlayerCharacterController, GameFlowManager>(m_Player, this);

        m_ObjectiveManager = FindObjectOfType<ObjectiveManager>();
		DebugUtility.HandleErrorIfNullFindObject<ObjectiveManager, GameFlowManager>(m_ObjectiveManager, this);

        AudioUtility.SetMasterVolume(1);
    }

    void Update()
    {
        if (gameIsEnding)
        {   
            Debug.Log("m_TimeLoadEndGameScene: " + m_TimeLoadEndGameScene);
            Debug.Log("Time.time: " + Time.time);
            Debug.Log("endSceneLoadDelay: " + endSceneLoadDelay);
            float timeRatio = 1 - (m_TimeLoadEndGameScene - Time.time) / endSceneLoadDelay;
            Debug.Log("timeRatio: " + timeRatio);
            
            endGameFadeCanvasGroup.alpha = timeRatio;

            AudioUtility.SetMasterVolume(1 - timeRatio);

            // See if it's time to load the  (after the delay)
            if (Time.time >= m_TimeLoadEndGameScene)
            {
                Debug.Log("Scene loading: " + m_SceneToLoad);
                SceneManager.LoadScene(m_SceneToLoad);
                gameIsEnding = false;
            }
        }
        else
        {
            if (m_ObjectiveManager.AreAllObjectivesCompleted())
                EndGame(true);

            // Test if player died
            if (m_Player.isDead)
                EndGame(false);
        }
    }

    void EndGame(bool win)
    {
        // unlocks the cursor before leaving the scene, to be able to click buttons
        Cursor.lockState = CursorLockMode.None;
        Cursor.visible = true;

        // Remember that we need to load the appropriate end scene after a delay
        gameIsEnding = true;
        endGameFadeCanvasGroup.gameObject.SetActive(true);
        if (win)
        {
            m_SceneToLoad = winSceneName;
            m_TimeLoadEndGameScene = Time.time + endSceneLoadDelay + delayBeforeFadeToBlack;

            // play a sound on win
            var audioSource = gameObject.AddComponent<AudioSource>();
            audioSource.clip = victorySound;
            audioSource.playOnAwake = false;
            audioSource.outputAudioMixerGroup = AudioUtility.GetAudioGroup(AudioUtility.AudioGroups.HUDVictory);
            audioSource.PlayScheduled(AudioSettings.dspTime + delayBeforeWinMessage);

            // create a game message
            var message = Instantiate(WinGameMessagePrefab).GetComponent<DisplayMessage>();
            if (message)
            {
                message.delayBeforeShowing = delayBeforeWinMessage;
                message.GetComponent<Transform>().SetAsLastSibling();
            }
        }
        else
        {
            m_SceneToLoad = loseSceneName;
            m_TimeLoadEndGameScene = Time.time + endSceneLoadDelay;
        }
    }
}

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

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

相关文章

Linux内核编译机制

文章目录 KconfigKconfig语法 KbuildMakefile Linux内核的编译主要过程&#xff1a;配置、编译、安装。 配置主要由Kconfig提供图形界面完成编译主要基于Kbuild编译系统&#xff0c;执行make完成编译安装主要也是基于Kbuild提供的脚本&#xff0c;然后执行make完成安装 Kconf…

【需求侧响应】综合能源中多种需求响应——弹性电价、可平移及可削减研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Java 函数式编程思考 —— 授人以渔

引言 最近在使用函数式编程时&#xff0c;突然有了一点心得体会&#xff0c;简单说&#xff0c;用好了函数式编程&#xff0c;可以极大的实现方法调用的解耦&#xff0c;业务逻辑高度内聚&#xff0c;同时减少不必要的分支语句&#xff08;if-else&#xff09;。 一、函数式编…

Openresty(二十一)ngx.balance和balance_by_lua灰度发布

一 openresty实现灰度发布 ① 灰度发布 说明&#xff1a; 早期博客对灰度发布的概念进行解读,并且对原生 nginx灰度实现进行讲解后续&#xff1a; 主要拿节点引流的灰度发布,并且关注gray灰度策略 相关借鉴 ② 回顾HTTP反向代理流程 ngx_http_upstream 可操作点&#…

数据结构与算法之树、森林与二叉树的转换(手绘)

树、森林与二叉树的转换 树、森林与二叉树的转换树转换成二叉树原则&#xff1a;步骤展示连线给出除长子外的结点去线层次调整 森林转换成二叉树原则步骤展示根据树转换成二叉树的原则将每颗树转变成二叉树第 n 棵树作为第 n-1 棵树根节点的右子节点 二叉树转换成树原则步骤展示…

KDM CCA Secure FHE

参考文献&#xff1a; [BFM88] Blum M, Feldman P, Micali S. Non-interactive zero-knowledge and its applications[M]//Providing Sound Foundations for Cryptography: On the Work of Shafi Goldwasser and Silvio Micali. 2019: 329-349.[FS90] Feige U, Shamir A. Witn…

智能合约漏洞案例,Euler Finance 1.96 亿美元闪电贷漏洞分析

智能合约漏洞案例&#xff0c;Euler Finance 1.96 亿美元闪电贷漏洞分析 2023 年 3 月 13 日上午 08:56:35 UTC&#xff0c;DeFi 借贷协议 Euler Finance 遭遇闪电贷攻击。 Euler Finance 是一种作为无许可借贷协议运行的协议。其主要目标是为用户提供各种加密货币的借贷便利。…

免单商城系统小程序开发源码功能解析

商品免单是现在很多商家喜欢做的一种营销活动&#xff0c;市面上几乎所有商家都是利用免单系统进行免单活动的&#xff0c;但大部分的免单系统仅仅只有排队免单功能&#xff0c;免单的周期长类目单一。我们的免单系统是将获客、拉新、留存、转化集于一身&#xff0c;多种免单拓…

什么是Java中的“内存屏障“(Memory Barrier)?它们有什么作用?

内存屏障是一种用于控制内存访问顺序的指令。在多核处理器上运行的多线程程序可能会因处理器的乱序执行和缓存一致性问题而导致意外的行为。内存屏障可以用来强制某些操作的顺序&#xff0c;以确保线程间的正确协同。 作用包括&#xff1a; 保证写入的可见性&#xff1a;内存…

前缀和实例4(和可被k整除的子数组)

题目&#xff1a; 给定一个整数数组 nums 和一个整数 k &#xff0c;返回其中元素之和可被 k 整除的&#xff08;连续、非空&#xff09; 子数组 的数目。 子数组 是数组的 连续 部分。 示例 1&#xff1a; 输入&#xff1a;nums [4,5,0,-2,-3,1], k 5 输出&#xff1a;7 …

Linux驱动IO篇——异步通知

文章目录 什么是异步通知异步通知和异步IO的区别信号含义应用层使用信号驱动如何实现异步信号驱动实例 什么是异步通知 异步通知在Linux的实现中是通过信号&#xff0c;而信号是在软件层次上对中断机制的一种模拟。这种机制和中断非常类似&#xff0c;所以可以以中断的思想来理…

AI绘画:如何让图片开口说话生成视频?变现渠道有哪些?

如何让AI绘画做出来的视频可以开口说话&#xff0c;本篇文章给你讲解清楚。 这个项目市面上有很多种叫法&#xff0c;AI数字人&#xff0c;图片说话&#xff0c;图片数字人等等。 废话不多说&#xff0c;直接以AI小和尚为例进行实操。 1.生成图片&#xff1a; 用Midjourney…

操作系统期末复习笔记

文章目录 操作系统第1章 计算机系统概述1 指令执行的基本指令周期2 中断分类与中断处理过程2.1 中断的定义2.2 中断分类2.3 中断的意义2.4 无中断2.5 有中断2.6 中断和指令周期2.7 中断处理的过程 3 处理多中断的两种方法3.1 顺序中断处理&#xff08;禁止中断&#xff09;3.2 …

大数据-玩转数据-Flink恶意登录监控

一、恶意登录 对于网站而言&#xff0c;用户登录并不是频繁的业务操作。如果一个用户短时间内频繁登录失败&#xff0c;就有可能是出现了程序的恶意攻击&#xff0c;比如密码暴力破解。 因此我们考虑&#xff0c;应该对用户的登录失败动作进行统计&#xff0c;具体来说&#x…

批量获取CSDN文章对文章质量分进行检测,有助于优化文章质量

&#x1f4da;目录 ⚙️简介✨分析获取步骤⛳获取文章列表☘️前期准备✨ 接口解析⚡️ 获取文章的接口 ☄️文章质量分接口⭐接口分析 ⌛代码实现&#xff1a;⚓核心代码:⛵测试用例:⛴ 运行效果:☘️增加Excel导出 ✍️结束 ⚙️简介 有时候我们写文章是为了记录当下遇到的bu…

乙方策划人员的内心独白:写不完的案子,是工作的常态吗?

在某种程度上来说&#xff0c;这是对的。 如果是年轻人来说&#xff0c;在甲方当策划就是当执行&#xff0c;只有积累一定经验才能真正实行策划任务、 而在乙方做策划那就是纯纯的策划&#xff0c;也就是你说的每天写不完的案子。 对于普通人的职场选择往往是就近选择&#…

服务治理平台:SOA与微服务架构的对比与区别

文章目录 1、场景引入2、面向服务的架构SOA3、微服务架构4、对比与联系5、服务治理平台 1、场景引入 如果我们打开支付宝首页&#xff0c;去看我们的余额&#xff0c;它会展示你的总资产&#xff0c;昨日收益、累计收益等信息。假如这个页面所展示的信息&#xff0c;都来自各个…

非常详细的trunk-based分支管理流程配置及使用

非常详细的trunk-based分支管理流程配置及使用。 目前业界主流的版本管理流程是Gitflow 和 trunk-based。 Gitflow流行的比较早。但是目前的流行度要低于 trunk-based模式工作流。trunk-based模式被誉为是现代化持续集成的最佳实践。 他俩的核心区别是,Gitflow是一个更严格…

格式化文件恢复软件有哪些 格式化文件恢复软件怎么用

格式化是指对磁盘或者磁盘中的分区进行初始化的一种操作&#xff0c;但是这种操作会造成磁盘内数据的清除。因此&#xff0c;当我们需要恢复一些数据时&#xff0c;就要借助相关数据恢复软件的帮助&#xff0c;那么下面就来给大家介绍格式化文件恢复软件有哪些&#xff0c;格式…

ORB-SLAM2_RGBD_DENSE_MAP编译、问题解决、离线加载TUM数据和在线加载D435i相机数据生成稠密地图

文章目录 0 引言1 安装依赖1.1 其他库安装1.2 pcl库安装 2 编译ORB-SLAM2_RGBD_DENSE_MAP2.1 build.sh2.2 build_ros.sh 3 运行ORB-SLAM2_RGBD_DENSE_MAP3.1 build.sh编译版本3.2 build_ros.sh编译版本 0 引言 ORB-SLAM2_RGBD_DENSE_MAP是基于ORB-SLAM2框架的一种RGB-D稠密地图…