Unity3D 太空大战射击游戏

news2025/4/22 3:18:04

一、前言

       本案例是初级案例,意在帮助想使用unity的初级开发者能较快的入门,体验unity开发的方便性和简易性能。

        本次我们将使用团结引擎进行开发,帮助想体验团结引擎的入门开发者进行较快的环境熟悉。

        本游戏案例以太空作战为背景,玩家和敌人为不同的飞船形象。敌人分为两种,可发射子弹和不能发射子弹,敌人射中玩家或者碰撞到玩家会消失,玩家生命减少。玩家每消灭一个敌人会获得相应的分数。游戏没有尽头,玩家生命值减少到0,游戏结束。

aa86498de99d47bdbc1ba237f5a0b909.png

二、开发环境

 操作系统:Windows

Unity 版本:团结引擎1.0.4

团结引擎的安装参考《团结引擎的安装》

三、搭建场景

3.1、 新建项目

        打开Tuanjie Hub,点击左上角【create project】按钮,选择【3D】模版,输入项目名称SpaceWar和项目保存路径,点击右下【Create project】按钮完成创建。

b6a7de7bb16c4f278fe9dbd5454a95e6.png

3.2、搭建开始场景

         团结引擎导入资源方式和Unity完全一样,对Unity导出的资源也完全兼容。下载本文附带的资源,点击【Assets】->【Import Package】->【Custom Package...】,选择下载好的资源,点右下角【Import】,将资源导入到项目。

451067fdbcae4f62bcb96005165bfffb.png

      3.2.1 搭建开始界面

        1. 双击打开start场景。我们在场景中创建标题和开始按钮。在Hierarchy面板右键【UI】->【Legacy】-> 【Text】,将Text命名为Title。调整文本大小为宽500,高100,字体大小设置为60,  颜色设置为白色,并是文本居中对齐,位置Y设置为130,如下所示:

f53c64a236954b369e33a4b9dcee2a36.png

       2. 接着创建一个开始按钮

        在Canvas上右键【UI】->【Legacy】-> 【Button】,将按钮命名为StartBtn。调整按钮大小为宽200,高40,设置按钮颜色为 665441,透明度调整为225(0.8)。设置按钮的文本为“开始游戏”,颜色设置为白色。最后调整按钮Y的位置为 -120, 效果如下:

ecd177e40fbf4fa19607ab3c5d31023a.png

        3. 添加按钮点击事件

        在Project区域的Assets下新建文件夹Scripts,用来保存我们脚本。在Scripts文件夹下右键【Create】->【C# Script】,创建一个脚本,命名为StartMenu.cs。双击打开StartMenu.cs脚本,输入以下代码:

using UnityEngine;
using UnityEngine.SceneManagement;

public class StartMenu : MonoBehaviour
{
    public void OnStartBtnClicked()
    {
        SceneManager.LoadScene(1);
    }
}

        保存脚本,将脚本挂载到Canvas上。选中StartBtn按钮,在Button组件下的事件部分点击+号添加点击事件,如图:

ac1fec82d6cc4045bbca57130a1a0403.png

        最后,点击【File】->【Build Settings】,将Assets下的start和level两个场景拖到Build Settings 的 Scenes In Build 下,如图:

ca15f0a5f03945b186d79b46de006a7a.png

        一切准备好后,点击运行按钮,看下效果。游戏运行后,点击开始游戏按钮,游戏切换到第二个场景,但第二个场景什么效果也没有,因为我们还没有进行开发,接下来我们就开始开发第二个场景。

3.3、搭建战斗场景

        双击打开 level1 场景,资源已经为我们准备好了战斗所需的场景。我们先来看一下场景中的资源。

0c4def26b60c447b97534d64f48f7a1b.png

        我们可以看到,在Assets的Prefab文件夹下有许多蓝色的物体,这就是预制体,这些预制体可以重复使用,场景中的蓝色物体就是使用了这些预制体。

        可以看到,场景中有三个一样的Enemy,而Prefab文件夹里有个Enemy2,Enemy2是一个飞机的模型预制体。为了充分利用所有的预制体,我们将替换场景中的一个Enemy。场景中的

        将Prefab文件夹里的Enermy2直接拖到场景中,将场景中第一个Enermy的坐标复制给Enermy2,然后删除第一个Enermy。如图所示:

af092f6839b0457ea160c9c2ea165466.png

        我们的游戏是这样的:Enemy 和 Enemy2是两种不同的敌人,Enemy不能发射子弹,但会不断改变方向,Enemy2可以发射子弹,但不能改变方向。无论是Enemy还是Enemy2,当碰撞到玩家的飞机后都会消失,同时玩家也会减少一点生命。

接下来我们就开始开发功能,首先我们要先让玩家动起来。

3.3.1 开发玩家脚本

       1.  让玩家动起来

         在Scripts文件夹下新建脚本,命名为Player。在Prefab文件夹下选中Player预制体,将Player脚本挂载到Player预制体上,双击打开Player脚本,输入以下代码:

using UnityEngine;

public class Player : MonoBehaviour
{
    public float m_Speed = 10.0f;

    void Update()
    {

        // 通过键盘按键控制玩家移动
        float h = 0f, v = 0f;  // 分别标识在水平和垂直方向上的移动距离


        if (Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow)) // 键盘字母A键或者左箭头
        {
            h += m_Speed * Time.deltaTime;
        }

        if (Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow)) // 键盘字母D键或者右箭头
        {
            h -= m_Speed * Time.deltaTime;
        }

        if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.UpArrow)) // 键盘字母W键或者向上箭头
        {
            v -= m_Speed * Time.deltaTime;
        }

        if (Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.DownArrow)) // 键盘字母S键或者向下箭头
        {
            v += m_Speed * Time.deltaTime;
        }

        transform.Translate(h, 0, v);

    }
}

        保存脚本,点击运行游戏看下效果。运行游戏后,在Game窗口,我们通过方向键或者ASDW按键就可以控制玩家的移动了,是不是很简单。

        2. 发射子弹

        我们继续在Player.cs脚本中添加发射子弹的功能。首先我们需要一个子弹的预制体来生成子弹。其次子弹不是每帧都生成,因此需要一个生成子弹的时间间隔。当我们在点击鼠标左键或者按空格键的时候,发射子弹。代码如下:

using UnityEngine;

public class Player : MonoBehaviour
{
    public float m_Speed = 10.0f;  // 移动速度
    public Transform m_RocketTrans; // 子弹预制体
    public float m_RocketRate = 0f;   // 子弹的发射频率

    void Update()
    {

        // 通过键盘按键控制玩家移动
        ...
        // 发射子弹
        m_RocketRate -= Time.deltaTime;
        if (m_RocketRate <= 0)
        {
            m_RocketRate = 0.1f; // 重置发射时间
            if (Input.GetKey(KeyCode.Space) || Input.GetMouseButton(0))
            {
                Instantiate(m_RocketTrans, transform.position, transform.rotation);

            }
        }
    }
}

        选中Player预制体,在 我们把Prefab文件夹下的Rocket预制体赋值给Player脚本的RocketTrans变量。

67f191c2201a407db747ee49f4c3c3d3.png

        接着,我们让子弹动起来。当发射子弹后,子弹朝着前方飞去。新建子弹的脚本文件,命名为Rocket.cs。选中Rocket预制体,将脚本挂在到预制体上。双击打开Rocket.cs脚本,输入以下代码:


using UnityEngine;

public class Rocket : MonoBehaviour
{
    public float m_Speed = 10.0f;  // 子弹的移动速度
    public float m_life = 1f;      // 子弹的生存时间


    void Update()
    {
        m_life -= Time.deltaTime;
        if (m_life <= 0)  
        {
            Destroy(gameObject);  // 销毁子弹
        }

        transform.Translate(0, 0, -m_Speed * Time.deltaTime); // 子弹移动
    }
}

        保存场景,运行游戏看下效果。运行游戏后,按空格或者鼠标左键,玩家飞机会发射子弹,并且子弹会一直朝前飞行。

       3.3.2 开发敌人脚本

        1. 让敌人动起来

        我们场景中有两种敌人。我们先给形状是飞碟的预制体添加脚本,飞碟不会发射子弹,但在飞行过程中会改变方向。飞碟的预制体为Enermy,因此我们新建一个Enermy.cs脚本,并把他挂载到Enermy预制体上。双击打开Enermy.cs 脚本,输入代码如下:


using UnityEngine;

public class Enermy : MonoBehaviour
{
    public float m_Speed = 1f;  // 飞行速度
    public float m_rotSpeed = 30f; // 旋转速度
    public float m_changeTimer = 1.5f; // 变向时间间隔


    void Update()
    {
        UpdateMove();
    }

    public virtual void UpdateMove()
    {
        m_changeTimer -= Time.deltaTime;
        if (m_changeTimer <= 0)
        {
            m_changeTimer = 3f;

            m_rotSpeed = -m_rotSpeed;
        }

        // 旋转方向
        transform.Rotate(Vector3.up, m_rotSpeed * Time.deltaTime, Space.World);

        // 移动
        transform.Translate(0, 0, -m_Speed * Time.deltaTime);
    }
}

        同样,我们接着给敌人Enermy2添加脚本。Enermy2是飞机模型,这种敌人可以发射子弹,但不能改变方向。我们新建脚本,命名为SuperEnermy.cs。将脚本挂载到Enermy2预制体上。双击打开SuperEnermy.cs脚本,输入以下代码:


using UnityEngine;

public class SuperEnermy : Enermy
{
    public Transform m_rockey;      // 子弹预制体
    public float m_fireTimer = 2f;  // 发射子弹的时间间隔

    private Transform m_player;  // 因为敌人的子弹要朝着玩家发射,因此需要玩家的引用

    private void Awake()
    {
        m_player = GameObject.FindGameObjectWithTag("Player").transform;
    }

    public override void UpdateMove()
    {
        m_fireTimer -= Time.deltaTime;
        if (m_fireTimer <= 0)
        {
            m_fireTimer = 2f;

            if (m_player != null)
            {
                Vector3 pos = transform.position - m_player.position;  // 玩家相对飞机的方向
                Instantiate(m_rockey, transform.position, Quaternion.LookRotation(pos));
            }
        }

        transform.Translate(0, 0, -m_Speed * Time.deltaTime);
    }

}

        保存脚本,然后把EnermyRocket预制体赋值给SuperEnermy.cs脚本的 m_rocket 字段,如图:

adf89bc1d3df4dcfb34cb2269ce799dc.png

        运行游戏,可以看到敌人的飞机每隔2秒就会产生子弹,但子弹还不会移动。下面我们就给敌人的子弹添加脚本。

        2. 敌人的子弹

        新建EnermyRocket.cs脚本,选中EnermyRocket预制体,将脚本挂载到此预制体上。双击打开EnermyRocket.cs脚本,只需要让本脚本继承Rocket类就可以让子弹动起来了。

       3.3.3 添加碰撞事件

        我们知道,对于敌人和玩家都是有一定生命的,当敌人生命为0或者碰到玩家时,敌人要进行销毁。但玩家生命为0时,游戏结束。

        下面我们就添加一下生命值和碰撞事件。

         1. 添加子弹碰撞事件

        打开Rocket.cs脚本,这是子弹脚本,我们添加表示子弹威力的字段 m_power,然后添加子弹的碰撞事件,代码如下:

using UnityEngine;

public class Rocket : MonoBehaviour
{
    public float m_Speed = 10.0f;  // 子弹的移动速度
    public float m_life = 1f;      // 子弹的生存时间

    public int m_power = 1;    // 子弹威力

    void Update()
    {
        ...
    }

    private void OnTriggerEnter(Collider other)
    {
        if (other.tag.CompareTo("Player") == 0)    // 对敌人无效,玩家子弹碰撞敌人我们在其他脚本实现
            return;

        Destroy(gameObject);  // 销毁子弹
    }
}

       2. 添加敌人子弹事件

        打开EnemyRocket.cs脚本,添加如下代码:

using UnityEngine;

public class EnermyRocket : Rocket
{
    private void OnTriggerEnter(Collider other)
    {
        if (other.tag.CompareTo("Enermy") == 0)
        {
            return;
        }

        Destroy(gameObject);
    }
}

       3. 添加敌人事件

        打开Enemy.cs脚本,添加如下代码:

using UnityEngine;

public class Enermy : MonoBehaviour
{
    public float m_Speed = 1f;  // 飞行速度
    public float m_rotSpeed = 30f; // 旋转速度
    public float m_changeTimer = 1.5f; // 变向时间间隔

    public int m_life = 10;

    void Update()
    {
        UpdateMove();
    }

    public virtual void UpdateMove()
    {
       ...
    }

    // 触发器事件
    private void OnTriggerEnter(Collider other)
    {
        if (other.tag.CompareTo("PlayerRocket") == 0)
        {
            Rocket rocket = other.GetComponent<Rocket>();
            if (rocket != null)
            {
                m_life -= rocket.m_power;  // 根据玩家子弹威力减少生命
                if (m_life <= 0)
                {
                    Destroy(gameObject); // 生命为0,销毁
                }
            }
        }
        else if(other.tag.CompareTo("Player") == 0)
        { 
            m_life = 0;
            Destroy(gameObject);
        }
    }
}

        4. 添加玩家事件

        打开Player.cs脚本,添加如下代码:

using UnityEngine;

public class Player : MonoBehaviour
{
    public float mSpeed = 10.0f;
    public Transform m_RocketTrans; // 子弹预制体
    public float m_RocketRate = 0f;   // 子弹的发射频率

    public int m_life = 10;   // 玩家的生命

    void Update()
    {
        ...
    }

    private void OnTriggerEnter(Collider other)
    {
        if (other.tag.CompareTo("PlayerRocket") == 0)
        {
            m_life -= 1;
            if (m_life <= 0)
            {
                Destroy(gameObject);
            }
        }
    }
}

        保存脚本,运行游戏,可以看到,玩家发射子弹已经可以消灭敌人了。

3.4 生成大量敌人

        目前场景中只有三个敌人,接下来我们就开始让游戏源源不断的生成敌人,已增加游戏的趣味性。

        1. 添加生成敌人脚本

        在Scripts文件夹下新建脚本 EnemySpawn.cs ,双加打开脚本,输入以下代码:

using UnityEngine;

public class EnemySpawn : MonoBehaviour
{
    public Transform m_Enermy;   // 敌人的预制体
    public float m_SpawnTime = 5f;  // 生成敌人的时间间隔

    private void Update()
    {
        m_SpawnTime -= Time.deltaTime;
        if (m_SpawnTime <= 0)
        { 
            m_SpawnTime = Random.value * 10f;  // 随机生成时间
            if (m_SpawnTime < 5)
                m_SpawnTime = 5;       // 最小生成时间间隔为5s

            Instantiate(m_Enermy, transform.position, Quaternion.identity);  // 生成敌人
        } 
    }
}

        在Prefabs文件夹下,选中Spawn1预制体,将脚本挂载到预制体上,然后把Enemy预制体拖入脚本的Enermy字段。同理给Spawn2挂载脚本,把Enermy2填入Enermy字段,如下:

        保存项目,运行游戏,可以看到已经可以源源不断的生成敌人了。至此,我们已经完成了游戏的主要功能开发,接下来我们将对游戏进行完善,如添加分数和游戏结束界面。

四、完善游戏

      4.1 搭建UI

        4.1.1 添加分数面板

        在Hierarchy窗口右键 ->[UI]->[Legacy]->[Text],   新建Text作为我们本局游戏的分数。在创建Text的同时会自动创建一个Canvas。我们在Canvas下新建一个空的物体,命名为ScorePanel,并设置RectTransform 的stretch如图:

         将Text放置在 ScorePanel下,并命名为Score。设置颜色为白色,文本内容暂时设置为Score:0,字体大小调整为36,并调整文本位置和大小,如图:

        4.1.2 搭建游戏结束界面。

        在Hierarchy窗口右键 ->[UI]->[Panel],   新建Panel作为我们游戏结束的背景。在创建Panel的同时会自动创建一个Canvas。我们在Canvas下新建一个空的物体,命名为GameOver,并设置RectTransform 的stretch如图:

        将Panel放置在 GameOver下,并命名为Bg。设置颜色为黑色,透明度调整为 130。

        在GameOver下新建一个文本组件(【UI】->【Legacy】->【Text】),命名为GameOverText,文本内容为“游戏结束”,设置字体大小为60,对齐方式改为上下居中,左右居中对齐, 颜色为白色,并调整文本组件的大小和位置如图:

        在GameOver下新建一个按钮组件(【UI】->【Legacy】->【Button】),命名为AgainBtn,将按钮文本改为“再来一局”,颜色为白色,调整按钮颜色为 665441,透明度设为235,并调整按钮大小和位置,如图:

        搭建完成后的最终效果和结构如下:

      4.2  添加脚本

         4.2.1 添加GameManager脚本

        新建GameManager.cs脚本,并将脚本挂载到场景中的GameManager物体上,双击打开脚本,输入以下代码,并给Again按钮添加点击绑定事件OnAgainBtnClicked。


using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class GameManager : MonoBehaviour
{
    public static GameManager Instance { get; private set; }  // GameManager 单例

    public Text m_scoreText;
    public GameObject m_ameOverPanel;

    public int m_score = 0;   // 得分
    
    

    private void Awake()
    {
        Instance = this;
    }


    void Start()
    {
        m_scoreText = GameObject.Find("Score").GetComponent<Text>();
        m_ameOverPanel = GameObject.Find("GameOver");
    }

    public void AddScore(int score)
    {
        m_score += score;
        m_scoreText.text = m_score.ToString();
    }

    public void GameOver()
    {
        m_ameOverPanel.SetActive(true);
    }

    public void OnAgainBtnClicked()
    { 
        SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
    }

}

我们在敌人销毁的时候增加分数。打开敌人脚本Enermy.cs,添加增加分数代码:

using UnityEngine;

public class Enermy : MonoBehaviour
{
    ......

    // 触发器事件
    private void OnTriggerEnter(Collider other)
    {
        if (other.tag.CompareTo("PlayerRocket") == 0)
        {
            Rocket rocket = other.GetComponent<Rocket>();
            if (rocket != null)
            {
                m_life -= rocket.m_power;  // 根据玩家子弹威力减少生命
                if (m_life <= 0)
                {
                    Destroy(gameObject); // 生命为0,销毁
                    GameManager.Instance.AddScore(m_point);  // 增加分数
                }
            }
        }
        else if(other.tag.CompareTo("Player") == 0)
        { 
            m_life = 0;
            Destroy(gameObject);
        }
    }
}

当玩家生命值为0的时候,游戏结束,打开游戏结束面。我们打开Player.cs 脚本。

using UnityEngine;

public class Player : MonoBehaviour
{
    ......

    private void OnTriggerEnter(Collider other)
    {
        if (other.tag.CompareTo("PlayerRocket") == 0)
        {
            m_life -= 1;
            if (m_life <= 0)
            {
                Destroy(gameObject);
                GameManager.Instance.GameOver();
            }
        }
    }
}

好了,到此为止,我们就可以愉快的玩游戏了,快去试试吧。

五、结束语

        好了,本次的案例到这里就结束了,虽然还有很多不足,但作为初学者的练习案例,也用到了许多Unity的基础知识,希望您能够获得一些启发,对您的学习有所帮助。您也可以发挥自己的想想力,完善本案例,比如音效等等,使游戏更加丰富。

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

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

相关文章

如何分析软件测试中发现的Bug!

假如你是一名软件测试工程师&#xff0c;每天面对的就是那些“刁钻”的Bug&#xff0c;它们像是隐藏在黑暗中的敌人&#xff0c;时不时跳出来给你一个“惊喜”。那么&#xff0c;如何才能有效地分析和处理这些Bug&#xff0c;让你的测试工作变得高效且有趣呢&#xff1f;今天我…

Threadlocal使用获取最后更新人信息

Threadlocal 的作用范围是一个线程&#xff0c;tomcat启动默认开启一个线程 首先点击登录&#xff0c;登录方法会返回token 拿到token后放在请求头中发送商品的插入请求&#xff0c;在插入是设置拿到token中的nickName&#xff08;花名&#xff09;放入&#xff08;lastUpdate…

C 语言中如何实现字符串的拼接?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01; &#x1f4d9;C 语言百万年薪修炼课程 【https://dwz.mosong.cc/cyyjc】通俗易懂&#xff0c;深入浅出&#xff0c;匠心打磨&#xff0c;死磕细节&#xff0c;6年迭代&…

轻松搭建RAG:澳鹏RAG开发工具

我们很高兴地宣布推出RAG开发工具&#xff0c;这是澳鹏大模型智能开发平台的一项新功能。此功能可帮助团队轻松创建高质量的检索增强生成 (RAG) 模型。 什么是 RAG&#xff1f; 检索增强生成 (RAG) 通过利用大量外部数据源&#xff08;例如企业的知识库&#xff09;显著增强了…

git查看版本,查看安装路径、更新版本

git version 查看版本 git update-git-for-windows 更新版本 git version 查看版本

美客多卖家必备:自养号测评补单技术的实战策略

构建美客多&#xff08;MercadoLibre&#xff09;自养号测评体系的稳健策略 一、确立目标与前期筹备 深入理解平台规范&#xff1a;首要任务是深入研究美客多平台的规则与指导方针&#xff0c;确保所有行动均符合平台要求&#xff0c;避免任何违规行为导致账号受限。 明确测评…

光电门验证动量守恒实验

本实验所需器件与第二个实验相同。但是连线方式有所区别&#xff0c;先将Arduino的电源输出接到两个光电门&#xff0c;然后再将光电门1的信号输出线接到Arduino的第10个端口&#xff0c;光电门2的信号输出线接到Arduino的第11个端口。对Arduino写入下列程序&#xff08;只有主…

删除【此电脑】中设备和驱动器下的迅雷下载方法

删除【此电脑】中设备和驱动器下的迅雷下载方法 我们安装迅雷下载、百度网盘、WPS等软件后&#xff0c;在【此电脑】–> 【设备和驱动器】目录下会看到这些驱动器的快捷方式&#xff0c;可以使用删除注册表的方式删除这些东西 启动注册表管理器 首先使用键盘快捷键 Win …

新零售起盘案例「半藏酱酒」布局路径,半藏总院分院招商模式

在当前白酒市场中&#xff0c;一款名为半藏酒的酒品以其独特的新零售模式引起了广泛关注。这种模式不同于传统销售方式&#xff0c;通过多种创新玩法&#xff0c;实现了销售与品牌推广的双重目标&#xff0c;让我们一起来看看细节。 半藏酒的分级代理制度将代理商分为两个层级&…

“未来城市发展之窗”2024上海城博会

随着2024年上海城市博览会的临近&#xff0c;招商工作正火热进行中&#xff0c;且已逐渐接近尾声。这场被誉为“城市未来之窗”的盛会&#xff0c;汇聚了全球各地的城市管理者、建筑师、规划师、投资者以及科技创新者&#xff0c;共同探讨城市发展的未来趋势和解决方案。 一、城…

JavaWeb-js(4)

js事件 在前端页面中&#xff0c;js程序大多数是由事件来驱动的&#xff0c;当触发某些事件的时候&#xff0c;可以使用js负责响应。 js事件由三部分组成: 事件源——》指的是被触发的对象; 事件类型——》如何触发的事件&#xff0c;如:鼠标单击、双击、键盘操作等;…

2024最新最全【Java】全栈,零基础入门到精通

Java基础 本文章是作者的学习笔记&#xff0c;帮助初学者快速入门&#xff0c;内容讲的不是很细&#xff0c;适合初学者&#xff0c;不定时更新。 目录 Java基础数据类型1.基本类型(primitive type)1-1 整数类型1-2 浮点类型1-3 字符类型1-4 boolean类型 2.引用数据类型3.类型…

2024.7.11最新版IDM破解,操作简单

前言 IDM的强劲对手&#xff0c;100%免费&#xff0c;如果破解IDM失败&#xff0c;推荐使用FDM&#xff0c;下载地址&#xff1a;Free Download Manager 破解步骤 打开PowerShell&#xff0c;非CMD 在左下角开始菜单右键点击后选择PowerShell&#xff0c;注意不是打开CMD。…

大模型时代的基础架构:大模型算力中心建设指南

&#x1f482; 个人网站:【 摸鱼游戏】【网址导航】【神级代码资源网站】&#x1f91f; 一站式轻松构建小程序、Web网站、移动应用&#xff1a;&#x1f449;注册地址&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交…

hbase学习

hbase学习 hbase概述&#xff1a; HBase 是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统&#xff0c;用于存储海量的结构化或者半结构化&#xff0c;非结构化的数据&#xff08;底层是字节数组做存储的&#xff09; HBase是Hadoop的生态系统之一&#xff0c;是建立在…

开源浏览器引擎:WebKit简介及工作流程、优缺点

WebKit是一个开源的浏览器引擎&#xff0c;最初由苹果公司基于KHTML&#xff08;K Desktop Environment的HTML渲染引擎&#xff09;开发&#xff0c;并广泛应用于Safari浏览器&#xff0c;后来也被其他多款浏览器和应用采用。WebKit负责解析HTML、CSS、JavaScript等网页内容&am…

【动态规划Ⅳ】二维数组的动态规划——最小路径和

二维数组的动态规划 最小路径和64. 最小路径和原地修改数组定义二维数组进行状态转移优化&#xff1a;用 一维数组进行状态转移相似题目&#xff1a;LCR 166. 珠宝的最高价值 120. 三角形最小路径和原地修改数组定义二维数组进行状态转移一维数组进行状态转移自底向上&#xff…

获取商铺信息,以及商铺信息的增删改查

本文章主要讲述如何对商铺信息进行基本的增删改查操作&#xff0c;及数据库对比。 1、获取首页仪表盘统计数据接口 待收费金额&#xff1a; SELECT count(1) as count,IFNULL(sum(total),0)as sum FROM payment_bill WHERE enabled_mark 1 AND pay_state0 欠费数据&#xf…

Linux-shell编程入门基础

文章目录 前言Shell编程bash特性shell作用域变量环境变量$特殊变量$特殊状态变量 $特殊符号(很重要)其他内置shell命令shell语法的子串截取统计 指令执行时间练习shell特殊扩展变量父子shell的理解内置和外置命令区别 数值计算双括号(())运算letexprexpr模式匹配 bcawk中括号 s…

LabVIEW电容器充放电监测系统

概述 为了对车用超级电容器的特性进行研究&#xff0c;确保其在工作时稳定可靠并有效发挥性能优势&#xff0c;设计了一套车用超级电容器充放电监测系统。该系统通过利用传感器、USB数据采集卡、可调直流稳压电源、电子负载以及信号调理电路&#xff0c;完成对各信号的采集和超…