Unity笔记-打飞碟游戏

2023-11-18

目的:创建一个打飞碟游戏(简陋)


游戏要求:
游戏要分多个 round , 飞碟数量每个 round 都是 n 个,但色彩,大小;发射位置,速度,角度,每次发射数量可以变化。
游戏过程中,仅能创建 n 个飞碟, 且不容许初始化阶段生成任何飞碟。 飞碟线路计算请使用 mathf 类。 向下加速度 a 是常数。 飞碟被用户击中,则回收。并按你定义的规则计算分数。飞碟落地(y < c),则自动回收。


第一步需要做的是先把一些万年不变的代码写出来。

// SSDirector.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SSDirector : Object {
    private static SSDirector _instance;
    public SceneController currentSceneController { get; set; }
    public bool running { get; set; }
    public static SSDirector getInstance()
    {
        if (_instance == null)
        {
            _instance = new SSDirector();
        }
        return _instance;
    }
    public int getFPS()
    {
        return Application.targetFrameRate;
    }
    public void setFPS(int fps)
    {
        Application.targetFrameRate = fps;
    }
    public void NextScene()
    {

    }
}
// SceneController.cs
public class SceneController : MonoBehaviour {
    void Awake()
    {
        SSDirector director = SSDirector.getInstance();
        director.setFPS(60);
        director.currentSceneController = this;
        director.currentSceneController.LoadResources();
    }

    public void LoadResources()
    {

    }
}

第二步:回到Unity界面,新建一个圆柱体,命名为Disk,Disk的厚度调整到你认为它看起来像个碟为止,而半径大小则不着急,因为飞碟大小是变化的。
这里写图片描述
鉴于我是做完才写这个博客的,懒得重新截图,就不放图了
然后在上面新增一个脚本DiskData.cs,并将它做成预制,然后将它从场景中删除。


第三步,需要了解:脚本这个东西可以跟其他Component一样被实例化,实例化之后会有对应的GameObject产生。因此为了记录飞碟的属性,我们新建一个脚本DiskData.cs来记录飞碟的各种属性

// DiskData.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Ruler
{
    public Color color;
    public float size;
    public Vector3 position;
    public float speed;
    public Vector3 direction; // 单位向量

    public Ruler(Color color, float size, Vector3 position, float speed, Vector3 direction)
    {
        this.color = color;
        this.size = size;
        this.position = position;
        this.speed = speed;
        this.direction = direction;
    }
}

public class DiskData : MonoBehaviour {
    public Ruler _ruler;
}

Ruler的作用在之后会提到。
在第四步开始前,一定要记住DiskData都挂着一个GameObject,并且可以通过diskdata.gameObject来访问。搞清楚这一点就不会在后面为了选择GameObject还是DiskData作为函数输入输出而烦恼了。


第四步:建立工厂模式
课件给出的伪代码

getDisk(ruler)
    IF (free list has disk) THEN
        a_disk = remove one from list
    ELSE
        a_disk = clone from Prefabs
    ENDIF
    Set DiskData of a_disk with the ruler
    Add a_disk to used list
    Return a_disk
FreeDisk(disk)
    Find disk in used list
    IF (not found) THEN THROW exception
    Move disk from used to free list

于是我的代码和他几乎一模一样

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DiskFactory : MonoBehaviour {
    public DiskData prefab;
    List<DiskData> used = new List<DiskData>();
    List<DiskData> free = new List<DiskData>();

    public DiskData getDisk(Ruler ruler)
    {
        DiskData a_disk;
        if (free.Count > 0)
        {
            a_disk = free[0];
            free.RemoveAt(0);
        }
        else
        {
            a_disk = Instantiate(prefab);
        }
        a_disk.ruler = ruler;
        used.Add(a_disk);
        return a_disk;
    }

    public void freeDisk(DiskData disk)
    {
        free.Add(disk);
        if (!used.Remove(disk))
        {
            throw new System.Exception();
        }
    }
}

Ruler的作用就显现出来了:如果我们要生产一个飞碟,我们需要知道它的所有属性值,这些属性值由场景提供。如果没有Ruler类,那么getDisk的原型是这样的:

public DiskData getDisk(Color color, float size, Vector3 position, float speed, Vector3 direction)

冗长不美观是一个问题,但更严重的是,如果我想增加或者删除飞碟的属性,那么我就要修改getDisk的参数列表,那么会非常麻烦而且容易出错。


第五步:设置Ruler的目的还有另外一个就是方便对disk的属性进行修改

public class DiskData : MonoBehaviour {
    Ruler _ruler;
    public Ruler ruler {
        get
        {
            return _ruler;
        }
        set
        {
            _ruler = value;
            gameObject.GetComponent<Renderer>().material.color = value.color;
            gameObject.transform.localScale = new Vector3(value.size, 0.05f, value.size);
            gameObject.transform.position = value.position;
        }
    }
}

联系到前面DiskFactory的代码:

a_disk.ruler = ruler;

这样就能轻松修改属性。


第六步:运动轨迹
这里的课程还没有教到刚体,因此用坐标变换来实现飞碟的运动。但其实利用刚体感觉更麻烦,而且unity那个施加力的动作至今我都觉得很迷。
我们使用一个方向向量来代表飞碟的方向。这个方向向量是一个单位向量。那么根据相似性,我们可以知道飞碟的初始速度的三个分量分别是初始速度的值乘上方向向量的对应分量的值,例如:
如果方向向量为(x,y,z),速度为a,那么x方向速度为a*x,以此类推。
然后联系到update的机制,update是不断更新的,所以我们可以用现在飞碟的状态,来算出下一时刻飞碟的状态。
在DiskData中增加三个变量:

public float vx, vy, vz;

ruler的set修改为:

public Ruler ruler {
        get
        {
            return _ruler;
        }
        set
        {
            _ruler = value;
            gameObject.GetComponent<Renderer>().material.color = value.color;
            gameObject.transform.localScale = new Vector3(value.size, 0.05f, value.size);
            gameObject.transform.position = value.position;
            vx = value.speed * value.direction.x;
            vy = value.speed * value.direction.y;
            vz = value.speed * value.direction.z;
        }
    }

然后在场景内增加一个runDisk的函数:

void runDisk(DiskData disk)
    {
        float xt1 = disk.gameObject.transform.position.x + disk.vx * Time.deltaTime;
        float zt1 = disk.gameObject.transform.position.z + disk.vz * Time.deltaTime;
        disk.vy -= gravity * Time.deltaTime;
        float yt1 = disk.gameObject.transform.position.y + disk.vy * Time.deltaTime;
        disk.gameObject.transform.position = new Vector3(xt1, yt1, zt1);
    }

上面代码都是简单的运动学公式。


第七步:
程序的所有代码都在下面的附件全部列出来了。现在将sceneController和DiskFactory挂载在一个空物体上,然后将刚才产生的预制,拖进DiskFactory的inspector标签里的prefab变量。就可以运行了。
你可能会发现里面还有很多代码我没说明,其实这些代码并不是关键,要么是它看起来就很容易理解(例如那个单例模式),要么就是有其它方法代替,例如那个ScoreController,其实完全可以不用。


后记:
这个打飞碟游戏其实还不完善。
- 分数直接print在console里
- round升级没有任何效果


附:所有代码
SSDirector.cs:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SSDirector : Object {
    private static SSDirector _instance;
    public SceneController currentSceneController { get; set; }
    public bool running { get; set; }
    public static SSDirector getInstance()
    {
        if (_instance == null)
        {
            _instance = new SSDirector();
        }
        return _instance;
    }
    public int getFPS()
    {
        return Application.targetFrameRate;
    }
    public void setFPS(int fps)
    {
        Application.targetFrameRate = fps;
    }
    public void NextScene()
    {

    }
}

Singleton.cs:(这是单例模式)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Singleton<T> : MonoBehaviour where T : MonoBehaviour {
    protected static T instance;
    public static T Instance
    {
        get
        {
            if (instance == null)
            {
                instance = (T)FindObjectOfType(typeof(T));
                if (instance == null)
                {
                    Debug.LogError("An instance of " + typeof(T) + " is needed in the scene, but thre is none.");
                }
            }
            return instance;
        }
    }
}

DiskData.cs:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Ruler
{
    public Color color;
    public float size;
    public Vector3 position;
    public float speed;
    public Vector3 direction; // 单位向量

    public Ruler(Color color, float size, Vector3 position, float speed, Vector3 direction)
    {
        this.color = color;
        this.size = size;
        this.position = position;
        this.speed = speed;
        this.direction = direction;
    }
}

public class DiskData : MonoBehaviour {
    Ruler _ruler;
    public Ruler ruler {
        get
        {
            return _ruler;
        }
        set
        {
            _ruler = value;
            gameObject.GetComponent<Renderer>().material.color = value.color;
            gameObject.transform.localScale = new Vector3(value.size, 0.05f, value.size);
            gameObject.transform.position = value.position;
            vx = value.speed * value.direction.x;
            vy = value.speed * value.direction.y;
            vz = value.speed * value.direction.z;
        }
    }
    public float vx, vy, vz;
    // Use this for initialization
    void Start () {
        //gameObject.GetComponent<Renderer>().material.color = color;
        //gameObject.transform.position = position;
        //gameObject.transform.localScale = new Vector3(size, 0.05f, size);
    }

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

    }
}

DiskFactory.cs:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DiskFactory : MonoBehaviour {
    public DiskData prefab;
    List<DiskData> used = new List<DiskData>();
    List<DiskData> free = new List<DiskData>();

    public DiskData getDisk(Ruler ruler)
    {
        DiskData a_disk;
        if (free.Count > 0)
        {
            a_disk = free[0];
            free.RemoveAt(0);
        }
        else
        {
            a_disk = Instantiate(prefab);
        }
        a_disk.ruler = ruler;
        used.Add(a_disk);
        return a_disk;
    }

    public void freeDisk(DiskData disk)
    {
        free.Add(disk);
        if (!used.Remove(disk))
        {
            throw new System.Exception();
        }
    }

    // Use this for initialization
    void Start () {

    }

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

    }
}

SceneController.cs:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ScoreController
{
    public int score = 0;
    public void record(DiskData disk)
    {
        score += Mathf.RoundToInt(disk.ruler.color.b +  disk.ruler.color.g + disk.ruler.color.r);
        score += Mathf.RoundToInt(disk.ruler.size);
        score += Mathf.RoundToInt(disk.ruler.speed);
    }
}

public class SceneController : MonoBehaviour {
    List<DiskData> diskList;
    DiskFactory diskFactory;
    ScoreController scoreCtrl;
    int round = 0;
    void Awake()
    {
        SSDirector director = SSDirector.getInstance();
        director.setFPS(60);
        director.currentSceneController = this;
        director.currentSceneController.LoadResources();
    }

    public void LoadResources()
    {
        diskList = new List<DiskData>();
        diskFactory = Singleton<DiskFactory>.Instance;
        scoreCtrl = new ScoreController();
    }

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    float interval = 0;
    public int upperNum;
    int leftNum;
    public Camera cam;
    Color[] colors = { Color.black, Color.blue, Color.cyan, Color.gray, Color.green, Color.magenta, Color.red, Color.white, Color.yellow };
    void Update () {
        interval += Time.deltaTime;
        if (interval >= 2f)
        {
            int shootNum = UnityEngine.Random.Range(1, upperNum/3);
            leftNum -= shootNum;
            if (leftNum <= 0)
            {
                round++;
                leftNum = upperNum;
            }
            for (int i = 0; i < shootNum; i++) {
                Color color = colors[UnityEngine.Random.Range(0, 9)];
                float size = UnityEngine.Random.Range(1f, 3f);
                Vector3 position = new Vector3(UnityEngine.Random.Range(-10f, 10f), 0, 0);
                float speed = UnityEngine.Random.Range(5f, 100f);
                Vector3 direction = new Vector3(
                    UnityEngine.Random.Range(-1000f, 1000f),
                    UnityEngine.Random.Range(0, 1000f),
                    UnityEngine.Random.Range(0, 1000f)
                    );
                direction.Normalize();
                Ruler ruler = new Ruler(color, size, position, speed, direction);
                diskList.Add(diskFactory.getDisk(ruler));
            }
            interval = 0;
        }
        for (int i = 0; i < diskList.Count; i++)
        {
            if (diskList[i].gameObject.transform.position.y < 0)
            {
                recycleDisk(diskList[i]);
            }
        }
        for (int i = 0; i < diskList.Count; i++)
        {
            runDisk(diskList[i]); 
        }
        if (Input.GetButtonDown("Fire1"))
        {
            Vector3 mousePosition = Input.mousePosition;
            Ray ray = cam.ScreenPointToRay(mousePosition);
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit))
            {
                scoreCtrl.record(hit.transform.gameObject.GetComponent<DiskData>());
                recycleDisk(hit.transform.gameObject.GetComponent<DiskData>());
                print(scoreCtrl.score);
            }
        }
    }

    void recycleDisk(DiskData disk)
    {
        disk.gameObject.transform.position = new Vector3(0, 0, -100);
        diskFactory.freeDisk(disk);
        diskList.Remove(disk);
    }
    public float gravity = 9.8f;
    void runDisk(DiskData disk)
    {
        float xt1 = disk.gameObject.transform.position.x + disk.vx * Time.deltaTime;
        float zt1 = disk.gameObject.transform.position.z + disk.vz * Time.deltaTime;
        disk.vy -= gravity * Time.deltaTime;
        float yt1 = disk.gameObject.transform.position.y + disk.vy * Time.deltaTime;
        disk.gameObject.transform.position = new Vector3(xt1, yt1, zt1);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity笔记-打飞碟游戏 的相关文章

  • visual studio:是否统一换行符 提示弹窗是否显示

    工具 选项 环境 文档 加载时检查一致的行尾
  • unity制作一个可以自由滑动收缩的历史记录功能。

    公司在做一款模拟经营类的卖车游戏 需要一个简单的历史记录功能 放在左上角 记录最近20条的收入 支出记录 超过2秒不动则收起 收起时展示最近的一个消息记录 用到的组件是ScrollView 使用方法可以参考我写过的一篇博客 ScrollVi
  • Input.GetAxis _ Unity3d

    Input GetAxis 获取轴 static function GetAxis axisName string float Description描述 Returns the value of the virtual axis iden
  • 1.17 从0开始学习Unity游戏开发--场景切换

    前面的所有文章我们都在一个固定的游戏场景内进行开发 在最开始介绍场景这个概念的时候就已经提及 这个场景可以是一张地图 或者是一个对战房间等等 所以显然这个场景可以有多个 并且可以从一个场景切换到另外一个场景 那么在Unity中如何进行场景切
  • [Unity XLua]热更新XLua入门(一)-基础篇

    Aladdin XLua 前言 前段时间腾讯开源了一个内部热更框架XLua在Unity开发群里引起一阵热议 也受到广大开发者的热捧 然后我当然也抱着好奇的心去学习学习 后面也会将扩展之后的工程放在git上 大家一起学习交流 在此感谢XLua
  • Unity动画系统详解

    目录 动画编辑器 编辑器面板 动画复用 前言 人形重定向动画 Humanoid 通用动画 Generic 旧版本动画 Legacy 动画控制器 系统状态 切换条件 状态机脚本 IK动画 反向动力学 BlendTree 混合树 Animato
  • Unity中实现倒计时的几种方式

    1 Time time using UnityEngine public class TimeTest MonoBehaviour public float secound 10 void Update Timing private flo
  • Unity中UI框架的使用1-添加面板、显示Loading页面

    其中BasePanel和Canvas都是挂在面板的预制物上的 1 导入我们的UI框架 本篇文章中有用的是两个UIPanelType NUIManager和NBasePanel 会放在文章最后供大家使用 2 先将我们做好的Panel设置成预制
  • Unity之获取游戏物体对象或组件的几个方法

    文章目录 前言 通过物体名称获取对象 GameObject Find Transform Find 通过物体标签获取对象 GameObject FindWithTag GameObject FindGameObjectWithTag Gam
  • Unity中UI组件

    一 Canvers 画布组件 Canvers下面是添加Button和Image组件 Rect Transform 1 Position 坐标位置 2 Width Height 高宽尺寸 3 Anchors 锚点 4 Pivot中心点 即UI
  • Unity 键盘控制人物移动——之输入方式代码的编写

    键盘输入 控制人物移动 在我们制作游戏中最常见的需求之一就是使用键盘移动游戏角色 那么我们首先需要获取键盘输入 以下提供两种方法获取键盘 这里尽量通过截图解释让大家理解代码的含义 GetInput void FixedUpdate Move
  • Mecanim Any State

    Any State表示任意状态 任意状态是 一个一直存在的特殊状态 他的存在是为了保证你在无意转移至某个你当前正处于的特殊状态而准备的 为你的状态机中的每个状态设置相同的对外转移是一个快捷的方式 假如有Walk Run Fly Die这四个
  • unity3d切换场景Application.LoadLevel(1)含义

    Application LoadLevel 1 场景ID
  • Unity万向节死锁解决方案(2023/12/4)

    1 万向节死锁无法解决 这是因为它的特性就是如此 就像玻璃杯就是玻璃 这不可否认 别钻牛角尖昂 2 大多数情况下欧拉角足够用 例如 CF 摄像机不可能绕z轴旋转 x轴旋转也不会超过九十度 因为那样人物的腰子会被扭断 塔防游戏 保卫萝卜 吃鸡
  • unity3d image组件不显示

    需要将UI组件放到画布下面
  • 【转载】【Unity】WebSocket通信

    1 前言 Unity客户端常用的与服务器通信的方式有socket http webSocket 本文主要实现一个简单的WebSocket通信案例 包含客户端 服务器 实现了两端的通信以及客户端向服务器发送关闭连接请求的功能 实现上没有使用U
  • U3D游戏开发中摇杆的制作(NGUI版)

    在PC端模拟摇杆 实现控制摇杆让玩家或者物体移动 以下是完整代码 using System Collections using System Collections Generic using UnityEngine public clas
  • 游戏开发常见操作梳理之NPC任务系统

    多数游戏存在任务系统 接下来介绍通过NPC触发任务的游戏制作代码 using System Collections using System Collections Generic using UnityEngine
  • 游戏开发常见操作梳理系列之——玩家信息的显示系统

    在游戏中 有不少游戏在左上角会出现玩家的头像和等级以及血量 这就是玩家的信息显示系统 那么这些是如何制作的呢 接下来我将讲讲代码的操作 其它操作我会在其它笔记中一一说明 敬请期待 信息的显示相当简单就是控制一些UI 然后在其它系统里面填写相
  • 游戏开发常见操作梳理之NPC药品商店系统(NGUI版)

    后续会出UGUI Json的版本 敬请期待 游戏开发中经常会出现药品商店 实际操作与武器商店类似 甚至根据实际情况可以简化设置 废话不多说 直接上代码 药品商店的源码 using System Collections using Syste

随机推荐

  • JS实现约瑟夫环

    传说罗马人占领了乔塔帕特 41 个犹太人被围堵在一个山洞里 他们拒绝被俘虏 而决定集体自杀 大家决定了一个自杀方案 41 个人围成一个圈 由第 1 个人开始顺时针报数 每报数为 3 的人立刻自杀 然后再由下一个人重新从 1 开始报数 依旧是
  • 笔记本电脑微信视频对方却听不到声音

    我真的是把网上的所有教程 试遍了都没弄好 我自己突发奇想要不然更新下 结果就成功了 首先可以先看看是不是微信版本的原因 麦克风出现问题了 右击我的电脑 gt 属性 gt 设备管理器 gt 音频输入和输出 gt 右击麦克风 gt 更新驱动程序
  • 数值分析Matlab二维正态(高斯)分布以及协方差矩阵

    数值分析Matlab二维正态 高斯 分布以及协方差矩阵 主要是使用了matlab的mvnrnd产生随机的正态 高斯 分布二维矩阵 然后绘制出来 代码运行结果生成的正态分布实验数据如图 MATLAB代码 mu1 0 0 sigma1 4 2
  • ACM输入输出

    写在前面 主要记录一下ACM输入输出的写法 一 输入数值 1 给定N的定长多行输入 题目 https ac nowcoder com acm contest 5657 B 代码 include
  • 【Java】基于朴素贝叶斯算法破解基于哈希表的随机字符替换加密算法

    Java 基于朴素贝叶斯算法破解基于哈希表的随机字符替换加密算法 不用看了 这篇文章是错的 得出的结果也不是正确的结果 我想错了 因为这个解密算法的前提是已经知道哈希表的情况下去计算的 而实际上应该是只靠统计去分析密文 所以实际破解所需要的
  • Unity模型导入相关知识

    文章目录 常见的模型格式 模型导入参数设置 Model页签 Scene设置 Meshes设置 Geometry设置 Rig页签 Animation Type 动画类型 Avatar化身信息设置 Animation页签 基础信息设置 动画剪辑
  • 童年回忆——切水果(内含源码inscode一键运行)

    前言 作者主页 雪碧有白泡泡 个人网站 雪碧的个人网站 推荐专栏 java一站式服务 React从入门到精通 前端炫酷代码分享 从0到英雄 vue成神之路 uniapp 从构建到提升 从0到英雄 vue成神之路 解决算法 一个专栏就够了 架
  • vue项目中使用pdf.js预览pdf文件

    项目要求需要预览pdf文件 网上找了很久 大多数都是推荐pdf js 自己起了解了一下 最后决定用pdf js 但是发现 在vue中使用这个很少 所以我就写这一篇帮助一下vue使用pdfjs的朋友 其实 这和前端框架无关的 直接使用pdf
  • 网络模拟(Network_simulation)

    https en wikipedia org wiki Network simulation In computer network research network simulation is a technique whereby a
  • CocoaPods创建管理类库的步骤

    用到的命令 1 git clone https github com jackLeong MySDK git 克隆一份远程仓库 2 git add fileName 把文件纳入git的缓存区 可使用 代替目录下的所有文件 3 git sta
  • Android 13 - Media框架(5)- NuPlayerDriver

    前面的章节中我们了解到上层调用setDataSource后 MediaPlayerService Client IMediaPlayer 会调用MediaPlayerFactory创建MediaPlayerBase Android为我们提供
  • 第3讲 Camera Sensor 数据流

    Camera Sensor Block Camera Sensor Output Format raw8 一个像素点用8bit来表示 范围0 256 raw10 一个像素点用10bit来表示 范围0 1024 raw12 一个像素点用12b
  • 数字化转型需要解决的五大问题

    更多专业文档请访问 www itilzj com 数字化 数字中国被列为十四五规划的核心之一 数字经济席卷各行各业 新一轮的商业马拉松枪声已经响起 无形的革新重塑着商业大环境 也赋予了我们丰富的想象空间 数字化转型需要解决的问题包括 1 解
  • Unity --- 文本的使用

    1 先讲讲legacy 旧版 的文本text 在一个画布上创建一个文本 这个文本也是一个游戏物体 且是画布的子物体 上面这个就是文本的inspector界面 在字体参数处我们可以点开框框选择新的字体资源 前提是我们有导入这个字体资源 行间距
  • MySQL之添加联合唯一索引

    一 联合唯一索引 项目中需要用到联合唯一索引 例如 有以下需求 每个人每一天只有可能产生一条记录 处了程序约定之外 数据库本身也可以设定 例如 t aa 表中有aa bb两个字段 如果不希望有2条一模一样的记录 即 aa字段的值可以重复 b
  • visio2016上下标

    之前的visio版本是有上下标的快捷按钮的 但是在visio2016中没有了 需要选中文字之后在 字体 选项卡 点击右下角的小箭头 在 位置 中选择上下标 或者使用快捷键 选中要成为上标的文字 ctrl shift 选中要成为下标的文字 c
  • Windows下修改VSCode工作区存储目录workspaceStorage

    VSCode会将每个工作区的一些配置 扩展 缓存等保存在一个默认的目录 在Windows下 此默认目录为 AppData Code User workspaceStorage 当存在多个工作空间或扩展时 需要使用大量的磁盘空间 而VSCod
  • EMC经典问答85问(75-77问)

    75 某个手持测试产品 可以电池供电 同时也可以采取外置适配器供电方式 适配器单独带负载辐射发射 RE 测试可以通过 手持产品在电池供电情况下辐射发射 RE 也可以通过 并且余量都比较大 但是在带外置适配器的情况下 却在 160M 频率左右
  • 23种设计模式概述

    设计模式共有23种 创建型模式5种 结构型模式7种 行为型模式11种 本章只做概念性说明 一 创建型模式 01 工厂模式 定义 又叫做静态工厂方法 定义一个用于创建对象的接口 让子类决定实例化哪一个类 工厂模式使得一个类的实例化延迟到子类
  • Unity笔记-打飞碟游戏

    目的 创建一个打飞碟游戏 简陋 游戏要求 游戏要分多个 round 飞碟数量每个 round 都是 n 个 但色彩 大小 发射位置 速度 角度 每次发射数量可以变化 游戏过程中 仅能创建 n 个飞碟 且不容许初始化阶段生成任何飞碟 飞碟线路