项目02《游戏-09-开发》Unity3D

基于      项目02《游戏-08-开发》Unity3D      ,

本次任务是做抽卡界面,获取的卡片增添在背包中,并在背包中可以删除卡片,

首先在Canvas下创建一个空物体,命名为LotteryPanel,作为抽卡界面,

在右上角的锚点处设置为拉伸模式,这样他的宽高就变成1920 * 1080,

首先给这个界面添加一个关闭按钮,

十连抽按键,

ctrl + d 复制一份按钮改为单抽,

然后创建一个Image子物体命名为LotteryItem并复制十份,

拖拽星级预制体,

修改位置,

添加颜色,

然后将其余9个LotteryItem删除,重新复制到10个,

再创建一个文件夹Lottery用来存放关于抽卡的预制体,

此时我们已经有了两个界面,一个是抽卡界面,一个是背包界面,

为了将这个两个界面联系起来,再做个主界面,

接下来调整位置,

添加好主界面之后,找到MainGame.cs脚本进行修改:

在PackageLocalData.cs脚本中增添方法:

using System.Collections.Generic;
using UnityEngine;
public class PackageLocalData{
    static PackageLocalData _instance;
    public static PackageLocalData Instance{
        get{
            if (_instance == null)
                _instance = new PackageLocalData();
            return _instance;
        }
    }
    //存
    public List<PackageLocalItem> items;
    public void SavaPackage(){
        string inventoryJson = JsonUtility.ToJson(this);
        PlayerPrefs.SetString("PackageLocalData", inventoryJson);
        PlayerPrefs.Save();
    }
    //取
    public List<PackageLocalItem> LoadPackage(){
        if (items != null)
            return items;
        if (PlayerPrefs.HasKey("PackageLocalData")){
            string inventoryJson = PlayerPrefs.GetString("PackageLocalData");
            PackageLocalData packageLocalData = JsonUtility.FromJson<PackageLocalData>(inventoryJson);
            items = packageLocalData.items;
            return items;
        }
        else{
            items = new List<PackageLocalItem>();
            return items;
        }
    }
    //添加抽卡阶段
    public void SavePackage(){
        string inventoryJson = JsonUtility.ToJson(this);
        PlayerPrefs.SetString("PackageLocalData", inventoryJson);
        PlayerPrefs.Save();
    }
}
[System.Serializable]
public class PackageLocalItem{
    public string uid;
    public int id;
    public int num;
    public int level;
    public bool isNew;
    public override string ToString(){
        return string.Format($"[id] {id} [num] {num}");
    }
}

using System.Collections.Generic;
using System.Runtime.InteropServices.WindowsRuntime;
using UnityEngine;
using static UIManager;
public class MainGame : MonoBehaviour{
    public static Player player;
    void Awake(){
        player = GameObject.Find("Player").GetComponent<Player>();
        //背包系统
        _instance = this;
        DontDestroyOnLoad(gameObject);
    }
    //背包系统
    static MainGame _instance;
    PackageTable packageTable;
    public static MainGame Instance{
        get{
            return _instance;
        }
    }
    void Start(){
        //UIManager.Instance.OpenPanel(UIConst.PackagePanel);
    }
    //对静态数据加载
    public PackageTable GetPackageTable(){
        if (packageTable == null)
            packageTable = Resources.Load<PackageTable>("TableData/PackageTable");
        return packageTable;
    }

    //对动态数据加载 
    public List<PackageLocalItem> GetPackageLocalData(){
        return PackageLocalData.Instance.LoadPackage();
    }
    //根据ID去表格中拿到指定的数据
    public PackageTableItem GetPackageItemById(int id){
        List<PackageTableItem> packageDataList = GetPackageTable().dataList;
        foreach (PackageTableItem item in packageDataList){
            if (item.id == id)
                return item;
        }
        return null;
    }
    //根据uid去本地数据中拿到动态数据
    public PackageLocalItem GetPackageLocalItemByUId(string uid){
        List<PackageLocalItem> packageDataList = GetPackageLocalData();
        foreach (PackageLocalItem item in packageDataList){
            if (item.uid == uid)
                return item;
        }
        return null;
    }
    public List<PackageLocalItem> GetSortPackageLocalData(){
        List<PackageLocalItem> localItems = PackageLocalData.Instance.LoadPackage();
        localItems.Sort(new PackageItemComparer());//添加
        return localItems;
    }
    public class PackageItemComparer : IComparer<PackageLocalItem>{
        public int Compare(PackageLocalItem a, PackageLocalItem b){
            PackageTableItem x = MainGame.Instance.GetPackageItemById(a.id);
            PackageTableItem y = MainGame.Instance.GetPackageItemById(b.id);
            //首先按star从大到小排序
            int starComparison = y.star.CompareTo(x.star);
            //如果star相同,则按id从大到小排序
            if (starComparison == 0){
                int idComparison = y.id.CompareTo(x.id);
                if (idComparison == 0)
                    return b.level.CompareTo(a.level);
                return idComparison;
            }
            return starComparison;
        }
    }

    //添加抽卡阶段字段
    public class GameConst {
        //武器类型
        public const int PackageTypeWeapon = 1;
        //食物类型
        public const int PackageTypeFood = 2;   
    }
    //添加抽卡阶段
    //根据类型获取配置的表格数据
    public List<PackageTableItem> GetPackageTableByType(int type){
        List<PackageTableItem> packageItems = new List<PackageTableItem>();
        foreach (PackageTableItem packageItem in GetPackageTable().dataList){
            if (packageItem.type == type)
                packageItems.Add(packageItem);
        }
        return packageItems;
    }
    //添加抽卡阶段具体逻辑 随机抽卡,获得一件武器
    public PackageLocalItem GetLotteryRandom1(){
        List<PackageTableItem> packageItems = GetPackageTableByType(GameConst.PackageTypeWeapon);
        int index = Random.Range(0, packageItems.Count);
        PackageTableItem packageItem = packageItems[index];
        PackageLocalItem packageLocalItem = new(){
            uid = System.Guid.NewGuid().ToString(),
            id = packageItem.id,
            num = 1,
            level = 1,
            isNew = CheckWeaponIsNew(packageItem.id),
        };
        PackageLocalData.Instance.items.Add(packageLocalItem);
        PackageLocalData.Instance.SavePackage();
        return packageLocalItem;    
    }
    public bool CheckWeaponIsNew(int id) {
        foreach (PackageLocalItem packageLocalItem in GetPackageLocalData()) {
            if (packageLocalItem.id == id)
                return false;
        }
        return true;
    }
    //随机抽卡 十连抽
    public List<PackageLocalItem> GetLotteryRandom10(bool sort = false) {
        //随机抽卡
        List<PackageLocalItem> packageLocalItems = new();
        for (int i = 0; i < 10; i++) {
            PackageLocalItem packageLocalItem = GetLotteryRandom1();
            packageLocalItems.Add(packageLocalItem);
        }
        //武器排序
        if (sort)
            packageLocalItems.Sort(new PackageItemComparer());
        return packageLocalItems;    
    }
}
下一步写整个抽卡界面的代码逻辑:

首先添加一个脚本LotteryPanel.cs

然后绑定脚本,

双击LotteryPanel.cs脚本修改代码:

using UnityEngine;
using UnityEngine.UI;
public class LotteryPanel : BasePanel{
    Transform UIClose;
    Transform UICenter;
    Transform UILottery10;
    Transform UILottery1;
    GameObject LotteryCellPrefab;
    protected override void Awake(){
        base.Awake();
        InitUI();
        InitPrefab();
    }
    void InitUI() {
        UIClose = transform.Find("TopRight/Close");
        UICenter = transform.Find("Center");
        UILottery10 = transform.Find("Bottom/Lottery10");
        UILottery1 = transform.Find("Bottom/Lottery1");
        UILottery10.GetComponent<Button>().onClick.AddListener(OnLottert10Btn);
        UILottery1.GetComponent<Button>().onClick.AddListener(OnLottert1Btn);

        UIClose.GetComponent<Button>().onClick.AddListener (OnClose);
    }
    void OnClose(){
        print(">>>>>>>> OnClose");
    }
    void OnLottert1Btn(){
        print(">>>>>>>> OnLottert1Btn");
    }
    void OnLottert10Btn(){
        print(">>>>>>>> OnLottert10Btn");
    }
    void InitPrefab() {
        LotteryCellPrefab = Resources.Load("Prefab/Panel/Lottery/LotteryItem") as GameObject;
    }
}
修改UIManager.cs脚本:

using System.Collections.Generic;
using UnityEngine;
public class UIManager{
    static UIManager _instance;
    Transform _uiRoot;
    //路径配置字典
    Dictionary<string, string> pathDict;
    //预制体缓存字典
    Dictionary<string, GameObject> prefabDict;
    //已打开界面的缓存字典
    public Dictionary<string, BasePanel> panelDict;
    public static UIManager Instance{
        get{
            if (_instance == null)
                _instance = new UIManager();
            return _instance;
        }
    }
    public Transform UIRoot{
        get{
            if (_uiRoot == null){
                if (GameObject.Find("Canvas"))
                    _uiRoot = GameObject.Find("Canvas").transform;
                else
                    _uiRoot = new GameObject("Canvas").transform;
            };
            return _uiRoot;
        }
    }
    UIManager(){
        InitDicts();
    }
    void InitDicts(){
        prefabDict = new Dictionary<string, GameObject>();
        panelDict = new Dictionary<string, BasePanel>();
        pathDict = new Dictionary<string, string>(){
            { UIConst.PackagePanel,"Package/PackagePanel"},//**
            //添加抽卡路径
            { UIConst.LotteryPanel,"Lottery/LotteryPanel"},
        };
    }
    public BasePanel GetPanel(string name){
        BasePanel panel = null;
        //检查是否已打开
        if (panelDict.TryGetValue(name, out panel))
            return panel;
        return null;
    }
    public BasePanel OpenPanel(string name){
        BasePanel panel = null;
        //检查是否已打开
        if (panelDict.TryGetValue(name, out panel)){
            Debug.Log($"界面已打开 {name}");
            return null;
        }
        //检查路径是否配置
        string path = "";
        if (!pathDict.TryGetValue(name, out path)){
            Debug.Log($"界面名称错误 或未配置路径 {name}");
            return null;
        }
        //使用缓存的预制体
        GameObject panelPrefab = null;
        if (!prefabDict.TryGetValue(name, out panelPrefab)){
            string realPath = "Prefabs/Panel/" + path;
            panelPrefab = Resources.Load<GameObject>(realPath) as GameObject;
            prefabDict.Add(name, panelPrefab);
        }
        //打开界面
        GameObject panelObject = GameObject.Instantiate(panelPrefab, UIRoot, false);
        panel = panelObject.GetComponent<BasePanel>();
        panelDict.Add(name, panel);
        panel.OpenPanel(name);
        return panel;
    }
    //关闭界面
    public bool ClosePanel(string name){
        BasePanel panel = null;
        if (!panelDict.TryGetValue(name, out panel)){
            Debug.LogError($"界面未打开 {name}");
            return false;
        }
        panel.ClosePanel();
        return true;
    }
    public class UIConst{
        //配置常量
        public const string PackagePanel = "PackagePanel";//**
        //添加抽卡阶段
        public const string LotteryPanel = "LotteryPanel";
    }
}
配置完成之后就可以在MainGame.cs脚本中打开这个界面,

运行游戏点击十连抽和单抽就会做出响应,

为了将背包与抽卡界面关联起来,先写主页面脚本,

创建新脚本MainPanel.cs脚本,

绑定脚本,

双击MainPanel.cs修改代码:

using UnityEditor;
using UnityEngine;
using UnityEngine.UI;
public class MainPanel : BasePanel{
    Transform UILottery;
    Transform UIPackage;
    Transform UIQuitBtn;
    protected override void Awake(){
        base.Awake();
        InitUI();
    }
    void InitUI(){
        UILottery = transform.Find("Top/LotteryBtn");
        UIPackage = transform.Find("Top/PackageBtn");
        UIQuitBtn = transform.Find("BottomLeft/QuitBtn");
        UILottery.GetComponent<Button>().onClick.AddListener(OnBtnLottery);
        UIPackage.GetComponent<Button>().onClick.AddListener(OnBtnPackage);
        UIQuitBtn.GetComponent<Button>().onClick.AddListener(OnQuitGame);
    }
    void OnQuitGame(){
        print(">>>>>  OnQuitGame");
        EditorApplication.isPlaying = false;
        Application.Quit();
    }
    void OnBtnPackage(){
        print(">>>>>  OnBtnPackage");
        UIManager.Instance.OpenPanel(UIManager.UIConst.PackagePanel);
        ClosePanel();
    }
    void OnBtnLottery(){
        print(">>>>>  OnBtnLottery");
        UIManager.Instance.OpenPanel(UIManager.UIConst.LotteryPanel);
        ClosePanel();
    }
}
接着修改UIManager.cs脚本:

using System.Collections.Generic;
using UnityEngine;
public class UIManager{
    static UIManager _instance;
    Transform _uiRoot;
    //路径配置字典
    Dictionary<string, string> pathDict;
    //预制体缓存字典
    Dictionary<string, GameObject> prefabDict;
    //已打开界面的缓存字典
    public Dictionary<string, BasePanel> panelDict;
    public static UIManager Instance{
        get{
            if (_instance == null)
                _instance = new UIManager();
            return _instance;
        }
    }
    public Transform UIRoot{
        get{
            if (_uiRoot == null){
                if (GameObject.Find("Canvas"))
                    _uiRoot = GameObject.Find("Canvas").transform;
                else
                    _uiRoot = new GameObject("Canvas").transform;
            };
            return _uiRoot;
        }
    }
    UIManager(){
        InitDicts();
    }
    void InitDicts(){
        prefabDict = new Dictionary<string, GameObject>();
        panelDict = new Dictionary<string, BasePanel>();
        pathDict = new Dictionary<string, string>(){
            { UIConst.PackagePanel,"Package/PackagePanel"},//**
            //添加抽卡路径
            { UIConst.LotteryPanel,"Lottery/LotteryPanel"},
            //添加主页面转换路径
            { UIConst.MainPanel,"MainPanel"},
        };
    }
    public BasePanel GetPanel(string name){
        BasePanel panel = null;
        //检查是否已打开
        if (panelDict.TryGetValue(name, out panel))
            return panel;
        return null;
    }
    public BasePanel OpenPanel(string name){
        BasePanel panel = null;
        //检查是否已打开
        if (panelDict.TryGetValue(name, out panel)){
            Debug.Log($"界面已打开 {name}");
            return null;
        }
        //检查路径是否配置
        string path = "";
        if (!pathDict.TryGetValue(name, out path)){
            Debug.Log($"界面名称错误 或未配置路径 {name}");
            return null;
        }
        //使用缓存的预制体
        GameObject panelPrefab = null;
        if (!prefabDict.TryGetValue(name, out panelPrefab)){
            string realPath = "Prefabs/Panel/" + path;
            panelPrefab = Resources.Load<GameObject>(realPath) as GameObject;
            prefabDict.Add(name, panelPrefab);
        }
        //打开界面
        GameObject panelObject = GameObject.Instantiate(panelPrefab, UIRoot, false);
        panel = panelObject.GetComponent<BasePanel>();
        panelDict.Add(name, panel);
        panel.OpenPanel(name);
        return panel;
    }
    //关闭界面
    public bool ClosePanel(string name){
        BasePanel panel = null;
        if (!panelDict.TryGetValue(name, out panel)){
            Debug.LogError($"界面未打开 {name}");
            return false;
        }
        panel.ClosePanel();
        return true;
    }
    public class UIConst{
        //配置常量
        public const string PackagePanel = "PackagePanel";//**
        //添加抽卡阶段
        public const string LotteryPanel = "LotteryPanel";
        //添加抽卡的主界面阶段
        public const string MainPanel = "MainPanel";
    }
}
最后修改MainGame.cs脚本:

再修改LotteryPanel.cs脚本:

再修改PackagePanel.cs脚本:

调整资源包位置,

运行游戏即可在背包中进行切换了,

接下来继续修改LotteryPanel.cs脚本:

先不写十连抽函数更重要的是去写更新单抽的逻辑脚本:

首先创建一个脚本LotteryCell.cs脚本,

绑定脚本,

双击LotteryCell.cs修改脚本:

using UnityEngine;
using UnityEngine.UI;
public class LotteryCell : MonoBehaviour{
    Transform UIImage;
    Transform UIStars;
    Transform UINew;
    PackageLocalItem packageLocalItem;
    PackageTableItem packageTableItem;
    LotteryPanel uiParent;
    void Awake(){
        InitUI();    
    }
    void InitUI(){
        UIImage = transform.Find("Center/Image");
        UIStars = transform.Find("Bottom/Stars");
        UINew = transform.Find("Top/New");
        UINew.gameObject.SetActive(false);
    }
    public void Refresh(PackageLocalItem packageLocalItem, LotteryPanel uiParent) {
        //数据初始化
        this.packageLocalItem = packageLocalItem;
        this.packageTableItem = MainGame.Instance.GetPackageItemById(this.packageLocalItem.id);
        this.uiParent = uiParent;

        //刷新UI信息
        RefreshImage();
    }
    void RefreshImage() {
        Texture2D t = (Texture2D)Resources.Load(this.packageTableItem.imagePath);
        Sprite temp = Sprite.Create(t, new Rect(0, 0, t.width, t.height), new Vector2(0, 0));
        UIImage.GetComponent<Image>().sprite = temp;    
    }
    public void RefreshStars() {
        for (int i = 0; i < UIStars.childCount; i++) {
            Transform star = UIStars.GetChild(i);
            if (this.packageTableItem.star > i)
                star.gameObject.SetActive(true);
            else
                star.gameObject.SetActive(false);
        }
    }
}
为了方便拓展的一个排序模式,修改PackagePanel.cs脚本

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public enum PackageMode{
    normal,
    delete,
    sort,
}
public class PackagePanel : BasePanel{
    Transform UIMenu;
    Transform UIMenuWeapon;
    Transform UIMenuFood;
    Transform UITabName;
    Transform UICloseBtn;
    Transform UICenter;
    Transform UIScrollView;
    Transform UIDetailPanel;
    Transform UILeftBtn;
    Transform UIRightBtn;
    Transform UIDeletePanel;
    Transform UIDeleteBackBtn;
    Transform UIDeleteInfoText;
    Transform UIDeleteConfirmBtn;
    Transform UIBottomMenus;
    Transform UIDeleteBtn;
    Transform UIDetailBtn;
    //添加
    public GameObject PackageUIItemPrefab;
    //添加一列用来容纳所有被选中的物品uid
    public List<string> deleteChooseUid;
    //添加删除属性
    public PackageMode curMode = PackageMode.normal;
    public void AddChooseDeleteUid(string uid) {
        this.deleteChooseUid ??= new List<string>();
        if(!this.deleteChooseUid.Contains(uid))
            this.deleteChooseUid.Add(uid);
        else
            this.deleteChooseUid.Remove(uid);
        RefreshDeletePanel();
    }
    //添加删除选中项
    void RefreshDeletePanel(){
        RectTransform scrollContent = UIScrollView.GetComponent<ScrollRect>().content;
        foreach(Transform cell in scrollContent){
            PackageCell packageCell = cell.GetComponent<PackageCell>();
            //todo:物品刷新选中状态
            //packageCell.RefreshDeleteState();
        }
    }
    //添加 表示当前选中的物品时哪一个uid
    string _chooseUid;
    public string ChooseUid {
        get { return _chooseUid; }
        set {
            _chooseUid = value;
            RefreshDetail();
        }
    }
    void RefreshDetail() {
        //找到uid对应的动态数据
        PackageLocalItem localItem = MainGame.Instance.GetPackageLocalItemByUId(ChooseUid);
        //刷新详情界面
        UIDetailPanel.GetComponent<PackageDetail>().Refresh(localItem, this);
    }
    override protected void Awake(){
        base.Awake();
        InitUI();
    }
    //添加1
    void Start(){
        RefreshUI();
    }
    //添加1
    void RefreshUI(){
        RefreshScroll();
    }
    //添加1
    void RefreshScroll(){
        //清理滚动容器中原本的物品
        RectTransform scrollContent = UIScrollView.GetComponent<ScrollRect>().content;
        for (int i = 0; i < scrollContent.childCount; i++)
            Destroy(scrollContent.GetChild(i).gameObject);
        //获取本地数据的方法拿到自己身上背包数据 并且根据背包数据初始化滚动容器
        foreach (PackageLocalItem localData in MainGame.Instance.GetSortPackageLocalData()){
            Transform PackageUIItem = Instantiate(PackageUIItemPrefab.transform, scrollContent) as Transform;

            PackageCell packageCell = PackageUIItem.GetComponent<PackageCell>();
            //添加2
            packageCell.Refresh(localData, this);
        }
    }
    void InitUI(){
        InitUIName();
        InitClick();
    }
    void InitUIName(){
        UIMenu = transform.Find("TopCenter/Menu");
        UIMenuWeapon = transform.Find("TopCenter/Menus/Weapon");
        UIMenuFood = transform.Find("TopCenter/Menus/Food");
        UITabName = transform.Find("LeftTop/TabName");
        UICloseBtn = transform.Find("RightTop/Close");
        UICenter = transform.Find("Center");
        UIScrollView = transform.Find("Center/Scroll View");
        UIDetailPanel = transform.Find("Center/DetailPanel");
        UILeftBtn = transform.Find("Left/Button");
        UIRightBtn = transform.Find("Right/Button");

        UIDeletePanel = transform.Find("Bottom/DeletePanel");
        UIDeleteBackBtn = transform.Find("Bottom/DeletePanel/Back");
        UIDeleteInfoText = transform.Find("Bottom/DeletePanel/InfoText");
        UIDeleteConfirmBtn = transform.Find("Bottom/DeletePanel/ConfirmBtn");
        UIBottomMenus = transform.Find("Bottom/BottomMenus");
        UIDeleteBtn = transform.Find("Bottom/BottomMenus/DeleteBtn");
        UIDetailBtn = transform.Find("Bottom/BottomMenus/DetailBtn");

        UIDeletePanel.gameObject.SetActive(false);
        UIBottomMenus.gameObject.SetActive(true);
    }
    void InitClick(){
        UIMenuWeapon.GetComponent<Button>().onClick.AddListener(OnClickWeapon);
        UIMenuFood.GetComponent<Button>().onClick.AddListener(OnClickFood);
        UICloseBtn.GetComponent<Button>().onClick.AddListener(OnClickClose);
        UILeftBtn.GetComponent<Button>().onClick.AddListener(OnClickLeft);
        UIRightBtn.GetComponent<Button>().onClick.AddListener(OnClickRight);

        UIDeleteBackBtn.GetComponent<Button>().onClick.AddListener(OnDeleteBack);
        UIDeleteConfirmBtn.GetComponent<Button>().onClick.AddListener(OnDeleteConfirm);
        UIDeleteBtn.GetComponent<Button>().onClick.AddListener(OnDelete);
        UIDetailBtn.GetComponent<Button>().onClick.AddListener(OnDetail);
    }

    void OnDetail(){
        print(">>>>>>> OnDetail()");
    }
    //进入删除模式 ; 左下角删除按钮
    void OnDelete(){
        print(">>>>>>> OnDelete()");
        curMode = PackageMode.delete;
        UIDeletePanel.gameObject.SetActive(true);
    }
    //确认删除
    void OnDeleteConfirm(){
        print(">>>>>>> OnDeleteConfirm()");
        if (this.deleteChooseUid == null)
            return;
        if (this.deleteChooseUid.Count == 0)
            return;
        MainGame.Instance.DeletePackageItems(this.deleteChooseUid);
        //删除完成后刷新整个背包页面
        RefreshUI();
    }
    //退出删除模式
    void OnDeleteBack(){
        print(">>>>>>> OnDeleteBack()");
        curMode = PackageMode.normal;
        UIDeletePanel.gameObject.SetActive(false);
        //重置选中的删除列表
        deleteChooseUid = new List<string>();
        //刷新选中状态
        RefreshDeletePanel();
    }
    void OnClickRight(){
        print(">>>>>>> OnClickRight()");
    }
    void OnClickLeft(){
        print(">>>>>>> OnClickLeft()");
    }
    void OnClickWeapon(){
        print(">>>>>>> OnClickWeapon()");
    }
    void OnClickFood(){
        print(">>>>>>> OnClickFood()");
    }
    void OnClickClose(){
        ClosePanel();
        UIManager.Instance.OpenPanel(UIManager.UIConst.MainPanel);
    }
}
这里会出现报红,修改MainGame.cs脚本添加删除方法即可:

using System.Collections.Generic;
using System.Runtime.InteropServices.WindowsRuntime;
using UnityEngine;
using static UIManager;
public class MainGame : MonoBehaviour{
    public static Player player;
    void Awake(){
        player = GameObject.Find("Player").GetComponent<Player>();
        //背包系统
        _instance = this;
        DontDestroyOnLoad(gameObject);
    }
    //背包系统
    static MainGame _instance;
    PackageTable packageTable;
    public static MainGame Instance{
        get{
            return _instance;
        }
    }
    void Start(){
        UIManager.Instance.OpenPanel(UIConst.MainPanel);
    }
    //对静态数据加载
    public PackageTable GetPackageTable(){
        if (packageTable == null)
            packageTable = Resources.Load<PackageTable>("TableData/PackageTable");
        return packageTable;
    }

    //对动态数据加载 
    public List<PackageLocalItem> GetPackageLocalData(){
        return PackageLocalData.Instance.LoadPackage();
    }
    //根据ID去表格中拿到指定的数据
    public PackageTableItem GetPackageItemById(int id){
        List<PackageTableItem> packageDataList = GetPackageTable().dataList;
        foreach (PackageTableItem item in packageDataList){
            if (item.id == id)
                return item;
        }
        return null;
    }
    //根据uid去本地数据中拿到动态数据
    public PackageLocalItem GetPackageLocalItemByUId(string uid){
        List<PackageLocalItem> packageDataList = GetPackageLocalData();
        foreach (PackageLocalItem item in packageDataList){
            if (item.uid == uid)
                return item;
        }
        return null;
    }
    public List<PackageLocalItem> GetSortPackageLocalData(){
        List<PackageLocalItem> localItems = PackageLocalData.Instance.LoadPackage();
        localItems.Sort(new PackageItemComparer());//添加
        return localItems;
    }
    public class PackageItemComparer : IComparer<PackageLocalItem>{
        public int Compare(PackageLocalItem a, PackageLocalItem b){
            PackageTableItem x = MainGame.Instance.GetPackageItemById(a.id);
            PackageTableItem y = MainGame.Instance.GetPackageItemById(b.id);
            //首先按star从大到小排序
            int starComparison = y.star.CompareTo(x.star);
            //如果star相同,则按id从大到小排序
            if (starComparison == 0){
                int idComparison = y.id.CompareTo(x.id);
                if (idComparison == 0)
                    return b.level.CompareTo(a.level);
                return idComparison;
            }
            return starComparison;
        }
    }

    //添加抽卡阶段字段
    public class GameConst {
        //武器类型
        public const int PackageTypeWeapon = 1;
        //食物类型
        public const int PackageTypeFood = 2;   
    }
    //添加抽卡阶段
    //根据类型获取配置的表格数据
    public List<PackageTableItem> GetPackageTableByType(int type){
        List<PackageTableItem> packageItems = new List<PackageTableItem>();
        foreach (PackageTableItem packageItem in GetPackageTable().dataList){
            if (packageItem.type == type)
                packageItems.Add(packageItem);
        }
        return packageItems;
    }
    //添加抽卡阶段具体逻辑 随机抽卡,获得一件武器
    public PackageLocalItem GetLotteryRandom1(){
        List<PackageTableItem> packageItems = GetPackageTableByType(GameConst.PackageTypeWeapon);
        int index = Random.Range(0, packageItems.Count);
        PackageTableItem packageItem = packageItems[index];
        PackageLocalItem packageLocalItem = new(){
            uid = System.Guid.NewGuid().ToString(),
            id = packageItem.id,
            num = 1,
            level = 1,
            isNew = CheckWeaponIsNew(packageItem.id),
        };
        PackageLocalData.Instance.items.Add(packageLocalItem);
        PackageLocalData.Instance.SavePackage();
        return packageLocalItem;    
    }
    public bool CheckWeaponIsNew(int id) {
        foreach (PackageLocalItem packageLocalItem in GetPackageLocalData()) {
            if (packageLocalItem.id == id)
                return false;
        }
        return true;
    }
    //随机抽卡 十连抽
    public List<PackageLocalItem> GetLotteryRandom10(bool sort = false) {
        //随机抽卡
        List<PackageLocalItem> packageLocalItems = new();
        for (int i = 0; i < 10; i++) {
            PackageLocalItem packageLocalItem = GetLotteryRandom1();
            packageLocalItems.Add(packageLocalItem);
        }
        //武器排序
        if (sort)
            packageLocalItems.Sort(new PackageItemComparer());
        return packageLocalItems;    
    }
    //添加删除背包道具方法
    public void DeletePackageItems(List<string> uids) {
        foreach(string uid in uids)
            DeletePackageItem(uid,false);
        PackageLocalData.Instance.SavePackage();
    }
    public void DeletePackageItem(string uid, bool needSave = true) {
        PackageLocalItem packageLocalItem = GetPackageLocalItemByUId(uid);
        if (packageLocalItem == null)
            return;
        PackageLocalData.Instance.items.Remove(packageLocalItem);
        if (needSave)
            PackageLocalData.Instance.SavePackage();
    }
}
修改PackageCell.cs脚本:

using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class PackageCell : MonoBehaviour,IPointerClickHandler,IPointerEnterHandler,IPointerExitHandler{
    Transform UIIcon;
    Transform UIHead;
    Transform UINew;
    Transform UISelect;
    Transform UILevel;
    Transform UIStars;
    Transform UIDeleteSelect;

    //添加
    Transform UISelectAni;
    Transform UIMouseOverAni;

    //动态数据
    PackageLocalItem packageLocalData;
    //静态数据
    PackageTableItem packageTableItem;
    //父物体也就是PackagePanel本身
    PackagePanel uiParent;

    void Awake(){
        InitUIName();
    }
    void InitUIName(){
        UIIcon = transform.Find("Top/Icon");
        UIHead = transform.Find("Top/Head");
        UINew = transform.Find("Top/New");
        UILevel = transform.Find("Bottom/LevelText");
        UIStars = transform.Find("Bottom/Stars");
        UISelect = transform.Find("Select");
        UIDeleteSelect = transform.Find("DeleteSelect");
        //添加
        UIMouseOverAni = transform.Find("MouseOverAni");
        UISelectAni = transform.Find("SelectAni");

        UIDeleteSelect.gameObject.SetActive(false);
        //添加
        UIMouseOverAni.gameObject.SetActive(false);
        UISelectAni.gameObject.SetActive(false);
    }
    //刷新
    public void Refresh(PackageLocalItem packageLocalData, PackagePanel uiParent){
        //数据初始化
        this.packageLocalData = packageLocalData;
        this.packageTableItem = MainGame.Instance.GetPackageItemById(packageLocalData.id);
        this.uiParent = uiParent;
        //等级信息
        UILevel.GetComponent<Text>().text = "Lv." + this.packageLocalData.level.ToString();
        //是否是新获得?
        UINew.gameObject.SetActive(this.packageLocalData.isNew);
        Debug.Log("ImagePath: " + this.packageTableItem.imagePath);
        //物品的图片
        Texture2D t = (Texture2D)Resources.Load(this.packageTableItem.imagePath);
        if (t != null){
            Sprite temp = Sprite.Create(t, new Rect(0, 0, t.width, t.height), new Vector2(0, 0));
            // 继续处理 Sprite 对象
            UIIcon.GetComponent<Image>().sprite = temp;
        }
        else{
            // 处理纹理加载失败的情况
            Debug.LogError("Failed to load texture.");
        }
        //刷新星级
        RefreshStars();
    }
    //刷新星级
    public void RefreshStars(){
        for (int i = 0; i < UIStars.childCount; i++){
            Transform star = UIStars.GetChild(i);
            if (this.packageTableItem.star > i)
                star.gameObject.SetActive(true);
            else
                star.gameObject.SetActive(false);
        }
    }

    public void OnPointerClick(PointerEventData eventData){
        //if (this.uiParent.ChooseUid == this.packageLocalData.uid)
        //    return;
        //根据点击设置最新的uid 进而刷新详情界面
        //this.uiParent.ChooseUid = this.packageLocalData.uid;
        //UISelectAni.gameObject.SetActive(true);
        //UISelectAni.GetComponent<Animator>().SetTrigger("In");
        //添加删除方法:
        if(this.uiParent.curMode == PackageMode.delete)
            this.uiParent.AddChooseDeleteUid(this.packageLocalData.uid);
        if (this.uiParent.ChooseUid == this.packageLocalData.uid)
            return;
        //根据点击设置最新的uid -> 进而刷新详情界面
        this.uiParent.ChooseUid = this.packageLocalData.uid;
        UISelectAni.gameObject.SetActive(true);
        UISelectAni.GetComponent<Animator>().SetTrigger("In");
    }

    public void OnPointerEnter(PointerEventData eventData){
        UIMouseOverAni.gameObject.SetActive(true);
        UIMouseOverAni.GetComponent<Animator>().SetTrigger("In");
    }

    public void OnPointerExit(PointerEventData eventData){
        Debug.Log($"OnPointerExit {eventData.ToString()}");
    }
    //添加删除方法
    public void RefershDeleteState() {
        if (this.uiParent.deleteChooseUid.Contains(this.packageLocalData.uid))
            this.UIDeleteSelect.gameObject.SetActive(true);
        else
            this.UIDeleteSelect.gameObject.SetActive(false);
    }
}
最后修改PackagePanel.cs脚本:

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public enum PackageMode{
    normal,
    delete,
    sort,
}
public class PackagePanel : BasePanel{
    Transform UIMenu;
    Transform UIMenuWeapon;
    Transform UIMenuFood;
    Transform UITabName;
    Transform UICloseBtn;
    Transform UICenter;
    Transform UIScrollView;
    Transform UIDetailPanel;
    Transform UILeftBtn;
    Transform UIRightBtn;
    Transform UIDeletePanel;
    Transform UIDeleteBackBtn;
    Transform UIDeleteInfoText;
    Transform UIDeleteConfirmBtn;
    Transform UIBottomMenus;
    Transform UIDeleteBtn;
    Transform UIDetailBtn;
    //添加
    public GameObject PackageUIItemPrefab;
    //添加一列用来容纳所有被选中的物品uid
    public List<string> deleteChooseUid;
    //添加删除属性
    public PackageMode curMode = PackageMode.normal;
    public void AddChooseDeleteUid(string uid) {
        this.deleteChooseUid ??= new List<string>();
        if(!this.deleteChooseUid.Contains(uid))
            this.deleteChooseUid.Add(uid);
        else
            this.deleteChooseUid.Remove(uid);
        RefreshDeletePanel();
    }
    //添加删除选中项
    void RefreshDeletePanel(){
        RectTransform scrollContent = UIScrollView.GetComponent<ScrollRect>().content;
        foreach(Transform cell in scrollContent){
            PackageCell packageCell = cell.GetComponent<PackageCell>();
            //todo: 物品刷新选中状态
            packageCell.RefershDeleteState();
        }
    }
    //添加 表示当前选中的物品时哪一个uid
    string _chooseUid;
    public string ChooseUid {
        get { return _chooseUid; }
        set {
            _chooseUid = value;
            RefreshDetail();
        }
    }
    void RefreshDetail() {
        //找到uid对应的动态数据
        PackageLocalItem localItem = MainGame.Instance.GetPackageLocalItemByUId(ChooseUid);
        //刷新详情界面
        UIDetailPanel.GetComponent<PackageDetail>().Refresh(localItem, this);
    }
    override protected void Awake(){
        base.Awake();
        InitUI();
    }
    //添加1
    void Start(){
        RefreshUI();
    }
    //添加1
    void RefreshUI(){
        RefreshScroll();
    }
    //添加1
    void RefreshScroll(){
        //清理滚动容器中原本的物品
        RectTransform scrollContent = UIScrollView.GetComponent<ScrollRect>().content;
        for (int i = 0; i < scrollContent.childCount; i++)
            Destroy(scrollContent.GetChild(i).gameObject);
        //获取本地数据的方法拿到自己身上背包数据 并且根据背包数据初始化滚动容器
        foreach (PackageLocalItem localData in MainGame.Instance.GetSortPackageLocalData()){
            Transform PackageUIItem = Instantiate(PackageUIItemPrefab.transform, scrollContent) as Transform;

            PackageCell packageCell = PackageUIItem.GetComponent<PackageCell>();
            //添加2
            packageCell.Refresh(localData, this);
        }
    }
    void InitUI(){
        InitUIName();
        InitClick();
    }
    void InitUIName(){
        UIMenu = transform.Find("TopCenter/Menu");
        UIMenuWeapon = transform.Find("TopCenter/Menus/Weapon");
        UIMenuFood = transform.Find("TopCenter/Menus/Food");
        UITabName = transform.Find("LeftTop/TabName");
        UICloseBtn = transform.Find("RightTop/Close");
        UICenter = transform.Find("Center");
        UIScrollView = transform.Find("Center/Scroll View");
        UIDetailPanel = transform.Find("Center/DetailPanel");
        UILeftBtn = transform.Find("Left/Button");
        UIRightBtn = transform.Find("Right/Button");

        UIDeletePanel = transform.Find("Bottom/DeletePanel");
        UIDeleteBackBtn = transform.Find("Bottom/DeletePanel/Back");
        UIDeleteInfoText = transform.Find("Bottom/DeletePanel/InfoText");
        UIDeleteConfirmBtn = transform.Find("Bottom/DeletePanel/ConfirmBtn");
        UIBottomMenus = transform.Find("Bottom/BottomMenus");
        UIDeleteBtn = transform.Find("Bottom/BottomMenus/DeleteBtn");
        UIDetailBtn = transform.Find("Bottom/BottomMenus/DetailBtn");

        UIDeletePanel.gameObject.SetActive(false);
        UIBottomMenus.gameObject.SetActive(true);
    }
    void InitClick(){
        UIMenuWeapon.GetComponent<Button>().onClick.AddListener(OnClickWeapon);
        UIMenuFood.GetComponent<Button>().onClick.AddListener(OnClickFood);
        UICloseBtn.GetComponent<Button>().onClick.AddListener(OnClickClose);
        UILeftBtn.GetComponent<Button>().onClick.AddListener(OnClickLeft);
        UIRightBtn.GetComponent<Button>().onClick.AddListener(OnClickRight);

        UIDeleteBackBtn.GetComponent<Button>().onClick.AddListener(OnDeleteBack);
        UIDeleteConfirmBtn.GetComponent<Button>().onClick.AddListener(OnDeleteConfirm);
        UIDeleteBtn.GetComponent<Button>().onClick.AddListener(OnDelete);
        UIDetailBtn.GetComponent<Button>().onClick.AddListener(OnDetail);
    }

    void OnDetail(){
        print(">>>>>>> OnDetail()");
    }
    //进入删除模式 ; 左下角删除按钮
    void OnDelete(){
        print(">>>>>>> OnDelete()");
        curMode = PackageMode.delete;
        UIDeletePanel.gameObject.SetActive(true);
    }
    //确认删除
    void OnDeleteConfirm(){
        print(">>>>>>> OnDeleteConfirm()");
        if (this.deleteChooseUid == null)
            return;
        if (this.deleteChooseUid.Count == 0)
            return;
        MainGame.Instance.DeletePackageItems(this.deleteChooseUid);
        //删除完成后刷新整个背包页面
        RefreshUI();
    }
    //退出删除模式
    void OnDeleteBack(){
        print(">>>>>>> OnDeleteBack()");
        curMode = PackageMode.normal;
        UIDeletePanel.gameObject.SetActive(false);
        //重置选中的删除列表
        deleteChooseUid = new List<string>();
        //刷新选中状态
        RefreshDeletePanel();
    }
    void OnClickRight(){
        print(">>>>>>> OnClickRight()");
    }
    void OnClickLeft(){
        print(">>>>>>> OnClickLeft()");
    }
    void OnClickWeapon(){
        print(">>>>>>> OnClickWeapon()");
    }
    void OnClickFood(){
        print(">>>>>>> OnClickFood()");
    }
    void OnClickClose(){
        ClosePanel();
        UIManager.Instance.OpenPanel(UIManager.UIConst.MainPanel);
    }
}

 修改LotteryPanel.cs脚本:

using System.Collections.Generic;
using UnityEditor.Build.Content;
using UnityEngine;
using UnityEngine.UI;
public class LotteryPanel : BasePanel{
    Transform UIClose;
    Transform UICenter;
    Transform UILottery10;
    Transform UILottery1;
    GameObject LotteryCellPrefab;
    protected override void Awake(){
        base.Awake();
        InitUI();
        InitPrefab();
    }
    void InitUI() {
        UIClose = transform.Find("TopRight/Close");
        UICenter = transform.Find("Center");
        UILottery10 = transform.Find("Bottom/Lottery10");
        UILottery1 = transform.Find("Bottom/Lottery1");
        UILottery10.GetComponent<Button>().onClick.AddListener(OnLottert10Btn);
        UILottery1.GetComponent<Button>().onClick.AddListener(OnLottert1Btn);

        UIClose.GetComponent<Button>().onClick.AddListener (OnClose);
    }
    void OnClose(){
        print(">>>>>>>> OnClose");
        ClosePanel();
        UIManager.Instance.OpenPanel(UIManager.UIConst.MainPanel);
    }
    void OnLottert1Btn(){
        print(">>>>>>>> OnLottert1Btn");
        //销毁原本的卡片
        for (int i = 0; i < UICenter.childCount; i++)
            Destroy(UICenter.GetChild(i).gameObject);
        //抽卡获得一张新的物品
        PackageLocalItem item = MainGame.Instance.GetLotteryRandom1();
        Transform LotteryCellTran = Instantiate(LotteryCellPrefab.transform, UICenter) as Transform;
        // 对卡片做信息展示刷新
        LotteryCell lotteryCell = LotteryCellTran.GetComponent<LotteryCell>();
        lotteryCell.Refresh(item, this);
    }
    void OnLottert10Btn(){
        print(">>>>>>>> OnLottert10Btn");
        List<PackageLocalItem> packageLocalItems = MainGame.Instance.GetLotteryRandom10(sort: true);
        for (int i = 0; i < UICenter.childCount; i++)
            Destroy(UICenter.GetChild(i).gameObject);
        foreach (PackageLocalItem item in packageLocalItems){
            Transform LotteryCellTran = Instantiate(LotteryCellPrefab.transform, UICenter) as Transform;
            // 对卡片做信息展示刷新
            LotteryCell lotteryCell = LotteryCellTran.GetComponent<LotteryCell>();
            lotteryCell.Refresh(item, this);
        }
    }
    void InitPrefab() {
        LotteryCellPrefab = Resources.Load("Prefabs/Panel/Lottery/LotteryItem") as GameObject;
    }
}

End.

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

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

相关文章

MyBatis之动态代理实现增删改查以及MyBatis-config.xml中读取DB信息文件和SQL中JavaBean别名配置

MyBatis之环境搭建以及实现增删改查 前言实现步骤1. 编写MyBatis-config.xml配置文件2. 编写Mapper.xml文件&#xff08;增删改查SQL文&#xff09;3. 定义PeronMapper接口4. 编写测试类1. 执行步骤2. 代码实例3. 运行log 开发环境构造图总结 前言 上一篇文章&#xff0c;我们…

PySpark(三)RDD持久化、共享变量、Spark内核制度,Spark Shuffle、Spark执行流程

目录 RDD持久化 RDD 的数据是过程数据 RDD 缓存 RDD CheckPoint 共享变量 广播变量 累加器 Spark 内核调度 DAG DAG 的宽窄依赖和阶段划分 内存迭代计算 Spark是怎么做内存计算的? DAG的作用?Stage阶段划分的作用? Spark为什么比MapReduce快&#xff1f; Spa…

Could not connect to Redis at 127.0.0.1:6379:由于目标计算机积极拒绝,无法连接...问题解决方法之一

一、问题描述 将Redis压缩包解压后&#xff0c;安装Redis过程中出现问题Could not connect to Redis at 127.0.0.1:6379:由于目标计算机积极拒绝&#xff0c;无法连接... 官网windows下redis开机自启动的指令如下&#xff1a; 1、在redis目录下执行 redis-server --service-in…

GEE Colab——如何利用Matplotlib在colab中进行图形制作

在colab中绘制图表 笔记本的一个常见用途是使用图表进行数据可视化。Colaboratory 提供多种图表工具作为 Python 导入,让这一工作变得简单。 Matplotlib Matplotlib 是最常用的图表工具包,详情请查看其文档,并通过示例获得灵感。 线性图 线性图是一种常见的图表类型,用…

按键扫描16Hz-单片机通用模板

按键扫描16Hz-单片机通用模板 一、按键扫描的原理1、直接检测高低电平类型2、矩阵扫描类型3、ADC检测类型二、key.c的实现1、void keyScan(void) 按键扫描函数①void FHiKey(void) 按键按下功能②void FSameKey(void) 按键长按功能③void FLowKey(void) 按键释放功能三、key.h的…

JavaScript综合练习2

JavaScript 综合练习 2 1. 案例演示 2. 代码实现 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title&…

Springboot根据环境读取application配置文件

目录 1. 首先创建两个不同配置文件 2. pom.xml 配置文件 3. 指定环境 4. 最后启动测试 1. 首先创建两个不同配置文件 分别为开发环境和生产环境 application-dev.properties 和 application-prod.properties application-dev.properties 配置为 1931 端口 application-pro…

放假--寒假自学版 day1(补2.5)

fread 函数&#xff1a; 今日练习 C语言面试题5道~ 1. static 有什么用途&#xff1f;&#xff08;请至少说明两种&#xff09; 1) 限制变量的作用域 2) 设置变量的存储域 2. 引用与指针有什么区别&#xff1f; 1) 引用必须被初始化&#xff0c;指针不必。 2) 引用初始…

【大数据】Flink 中的 Slot、Task、Subtask、并行度

Flink 中的 Slot、Task、Subtask、并行度 1.并行度2.Task 与线程3.算子链与 slot 共享资源组4.Task slots 与系统资源5.总结 我们在使用 Flink 时&#xff0c;经常会听到 task&#xff0c;slot&#xff0c;线程 以及 并行度 这几个概念&#xff0c;对于初学者来说&#xff0c;这…

【网工】华为设备命令学习(服务器发布)

本次实验主要是内网静态nat配置没&#xff0c;对外地址可以理解为一台内网的服务器&#xff0c;外网设备可以ping通内网的服务器设备&#xff0c;但是ping不通内网的IP。 除了AR1设备配置有区别&#xff0c;其他设备都是基础IP的配置。 [Huawei]int g0/0/0 [Huawei-GigabitEt…

双指针和单调栈

双指针 用于解决一类基于子段的统计问题 子段就是&#xff1a;数组中连续的一段 可以用一个闭区间来表示数组中的连续一段 这个方法核心就是优化&#xff1a;两种循环的枚举 也就是枚举左端点l和右端点r的所有可能优化关键就是&#xff1a;去除枚举中的冗余部分 具体优化策略…

设计模式-行为型模式(下)

1.访问者模式 访问者模式在实际开发中使用的非常少,因为它比较难以实现并且应用该模式肯能会导致代码的可读性变差,可维护性变差,在没有特别必要的情况下,不建议使用访问者模式. 访问者模式(Visitor Pattern) 的原始定义是&#xff1a; 允许在运行时将一个或多个操作应用于一…

【linux开发工具】vim详解

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 “学如逆水行舟&#xff0…

自适应二次元404页面源码

自适应二次元404页面源码&#xff0c;HTMLCSSJS,喜欢二次元的朋友可以下载使用 蓝奏云&#xff1a;https://wfr.lanzout.com/iuPNQ1ns7dxg

多模态对比语言图像预训练CLIP:打破语言与视觉的界限,具备零样本能力

多模态对比语言图像预训练CLIP:打破语言与视觉的界限,具备零样本能力。 一种基于多模态(图像、文本)对比训练的神经网络。它可以在给定图像的情况下,使用自然语言来预测最相关的文本片段,而无需为特定任务进行优化。CLIP的设计类似于GPT-2和GPT-3,具备出色的零射击能力…

API接口访问鉴权设计和实现的经验总结

API接口访问鉴权是保护API资源安全的重要措施。本文总结了一些常见的API接口访问鉴权设计和实现方法&#xff0c;以帮助开发人员更好地理解和应用这些技术。 1. 什么是API接口访问鉴权&#xff1f; - 解释了API接口访问鉴权的基本概念和作用&#xff0c;以及为什么需要对A…

R语言入门笔记2.0

1.创建数据框 在R语言中&#xff0c;可以使用data.frame函数来创建数据框。以下是一个简单的示例&#xff0c;这段R语言代码创建了一个名为student的数据框&#xff0c;其中包含了学生的ID、性别、姓名和出生日期&#xff0c;首先创建一个包含学生出生日期的向量&#xff0c;再…

基于华为云欧拉操作系统(HCE OS)容器化部署传统应用(Redis+Postgresql+Git+SpringBoot+Nginx)

写在前面 博文内容为 华为云欧拉操作系统入门级开发者认证(HCCDA – Huawei Cloud EulerOS)实验笔记整理认证地址&#xff1a;https://edu.huaweicloud.com/certificationindex/developer/9bf91efb086a448ab4331a2f53a4d3a1博文内容涉及一个传统 Springboot 应用HCE部署&#x…

文件上传-Webshell

Webshell简介 webshell就是以aspphpjsp或者cgi等网页文件形式存在的一种命令执行环境&#xff0c;也可以将其称做为一种网页木马后门。 攻击者可通过这种网页后门获得网站服务器操作权限&#xff0c;控制网站服务器以进行上传下载文件、查看数据库、执行命令等… 什么是木马 …

【Docker】02 镜像管理

文章目录 一、Images镜像二、管理操作2.1 搜索镜像2.1.1 命令行搜索2.1.2 页面搜索2.1.3 搜索条件 2.2 下载镜像2.3 查看本地镜像2.3.1 docker images2.3.2 --help2.3.3 repository name2.3.4 --filter2.3.5 -q2.3.6 --format 2.4 给镜像打标签2.5 推送镜像2.6 删除镜像2.7 导出…