unity 3D RPG高级教程(十)

2023-10-27

目录

声明

1.Action Button 快捷栏按键

2.Stats Info 显示 Player 相关信息

3.Change Animator 切换动画控制器

4.Item Tooltip 物品信息显示栏

5..Loot Items 掉落物品


声明

本教程学习均来自U3D中文课堂麦扣老师

1.Action Button 快捷栏按键

保证我们武器栏当中有武器,运行游戏发现没有生成武器 ,可以的话尽量使用MainMenu去进入游戏去测试我们背包里的每一个功能,确保它们没问题

现在做一个方法够关闭背包和Stats,先实现这个CloseButton按钮,

 这样就可以关闭背包和Stats了,那么如何再次打开呢,我们要在按键上做一个设置:

InventoryManager:

    [Header("UI Panel")]
    public GameObject bagPanel;
    public GameObject statsPanel;
    bool isOpen = false;//背包是否打开

    private void Update()
    {
        if(Input.GetKeyDown(KeyCode.B))//按下B键显示背包
        {
            isOpen = !isOpen;
            bagPanel.SetActive(isOpen);
            statsPanel.SetActive(isOpen);
        }
    }

 

 这样就实现了打开和关闭背包了

接下来我们要完成的就是Action Bar了,我们要Action Bar上面的每一个按键来添加匹配的键盘的按键,所以单独创建一个代码ActionButton,挂载到ActionButton预制体上,

 ActionButton:

public class ActionButton : MonoBehaviour
{
    public KeyCode actionKey;
}

  设置按键1-6,

 ActionButton:

public class ActionButton : MonoBehaviour
{
    public KeyCode actionKey;

    private SlotHolder currentSlotHolder;

    private void Awake()
    {
        currentSlotHolder = GetComponent<SlotHolder>();
    }
    private void Update()
    {
        if(Input.GetKeyDown(actionKey) && currentSlotHolder.itemUI.GetItem())//按下匹配按键且格子里有物品
        {
            currentSlotHolder.UseItem();//使用物品
        }
    }
}

现在就可以使用快捷栏按键和双击使用物品了

但是如果双击空格子,会出现报错,解决:

 SlotHolder:在使用物品方法中做一个非空的判断

    public void UseItem()//使用物品
    {
        if (itemUI.GetItem() != null)
        {
            if (itemUI.GetItem().itemType == ItemType.Useable && itemUI.Bag.items[itemUI.Index].amount > 0)//是可使用物品且数量大于0 itemUI.Bag.items[itemUI.Index].ItemData.itemType
            {
                GameManager.Instance.playerStats.ApplyHealth(itemUI.GetItem().useableData.healthPoint);
                itemUI.Bag.items[itemUI.Index].amount -= 1;//使用后数量减1
            }
        }
        UpdateItem();//更新物品
    }

这样就不会报错了

现在就实现了打开和关闭背包和人物的窗口,还有用快捷键来操作实现物品了

2.Stats Info 显示 Player 相关信息

我们来实现一下我们的信息面板,希望能显示Player的基本模型,并且可以在下面Update它的一些数据,

新建RawImage

 新建一个Render Texture

 现在我们要为我们的Player创建一个摄像机专门用来拍摄它,CullingMask选择Player,修改Environment和Output输出到Render Texture

 

现在就设置好人物的显示了,接下来要获得下面信息的更改,在InventoryManager里来获得这两个变量

InventoryManager:

using UnityEngine.UI;

    [Header("Stats Text")]
    public Text healthText;
    public Text attackText;

    private void Update()
    {
        UpdateStatsText(GameManager.Instance.playerStats.MaxHealth, GameManager.Instance.playerStats.attactData.minDamge,
            GameManager.Instance.playerStats.attactData.maxDamge);//更新玩家属性文本
    }

    public void UpdateStatsText(int health,int min,int max)//更新玩家属性文本
    {
        healthText.text = health.ToString();
        attackText.text = min + " - " + max;
    }

 拖拽赋值

这样就更新显示 Player 相关信息了。

3.Change Animator 切换动画控制器

接下来我们要实现的是当我们的玩家切换武器的时候它伴随的动画也可以随之切换,为了达到这个效果我们要制作几套这个动画,

 

新建Animator Ovrride Controller

 删除Run动画里的事件

将原来的PlayerController更名为Player_Sword&Shield 

 

 那么如何切换呢?

 在这里面我希望这个武器有自己的攻击信息以外,也保留配套的动画信息,这样我们就能把动画信息传到Player身上,

ItemData_SO:

    [Header("Weapon")]
    ····
    public AnimatorOverrideController weaponAnimator;

因为我们创建的是Animator把Player_Sword&Shield更改为Player_Base,在创建一个AnimatorOverrideController,命名为Player_Sword&Shield,不做任何更改

 

 接下来去到装备武器的时候同时切换我们的动画,

CharacterStats:

    private RuntimeAnimatorController baseAnimator;//基础动画控制器

    private void Awake()
    {
        ...
        baseAnimator = GetComponent<Animator>().runtimeAnimatorController;
    }    
        
    #region Equip Weapon
    public void ChangeWeapon(ItemData_SO weapon)//切换武器
    {
        UnequipWeapon();//卸下武器
        EquipWeapon(weapon);//装备武器
    }
    public void EquipWeapon(ItemData_SO weapon)//装备武器
    {
        if(weapon.weaponPrefab != null)
        {
            Instantiate(weapon.weaponPrefab, weaponSlot);
        }

        //TODO:更新属性
        //TODO:切换动画
        GetComponent<Animator>().runtimeAnimatorController = weapon.weaponAnimator; 
        attactData.ApplyWeaponData(weapon.weaponData);
        //InventoryManager.Instance.UpdateStatsText(MaxHealth,attactData.minDamge,attactData.maxDamge);//更新玩家属性文本
    }

    public void UnequipWeapon()//卸下武器
    {
        if(weaponSlot.transform.childCount != 0)
        {
            for (int i = 0; i < weaponSlot.transform.childCount; i++)
            {
                Destroy(weaponSlot.transform.GetChild(i).gameObject);
            }
        }
        attactData.ApplyWeaponData(baseAttackData);
        //TODO:切换动画
        GetComponent<Animator>().runtimeAnimatorController = baseAnimator;
    }
    #endregion

现在可以看到可以切换动画,但是在Stats面板看不到Player拿武器,因为人物的摄像机只渲染属于Player图层上的物品。

将武器设置为Player的Layer:

 这样就能切换武器同时切换动画了。

4.Item Tooltip 物品信息显示栏

制作物品当鼠标划过去的时候会显示详情:

新建Image:Item Tooltip

希望在调整大小的时候4个边框不会受到转变,那么就需要把它设置为Slice

 因为我们背包当中的物品的描述都是不一样的,有些非常长,有些非常短,我希望Item Tooltip会根据信息的长度自动调整大小:

添加Content Size Fitter组件:

添加Text:

如果手动在这里面去调整它的大小的话,非常不利于我们后期自动去填充显示它所有文字的内容,所以排版的过程中也需要按照一定的规则,添加 Virtual Layout Group组件

 下面的文字我希望它也可以根据我的字数进行拉伸,这样的话就可以保证我的Item Tooltip可以根据它的比例进行拉伸了,同样添加Content Size Fitter组件

 现在就可以自动调整大小了

 接下来写代码控制一下:

ItemTooltip:

using UnityEngine.UI;

public class ItemTooltip : MonoBehaviour
{
    public Text itemNameText;
    public Text itemInfoText;

    public void SetupTooltip(ItemData_SO item)//显示物品信息
    {
        itemNameText.text = item.itemName;
        itemInfoText.text = item.description;
    }
}

 Inventory Manager:控制Tooltip显示 

    [Header("Tooltip")]
    public ItemTooltip tooltip;

 什么时候把格子 Set up好呢,去到SlotHolder,每一个格子有物品信息的显示,怎么判断鼠标是否悬停在格子上呢?我们用到IPointerClickHandler系列当中的另外的一个接口:

有悬停,所以有悬停离开,我们添加这2个接口:

SlotHolder:

public class SlotHolder : MonoBehaviour,IPointerClickHandler,IPointerEnterHandler,IPointerExitHandler
{
    public void OnPointerEnter(PointerEventData eventData)//鼠标悬停查看物品详情
    {
        if (itemUI.GetItem() != null)
        {
            InventoryManager.Instance.tooltip.SetupTooltip(itemUI.GetItem());//显示物品信息
            InventoryManager.Instance.tooltip.gameObject.SetActive(true);
        }
    }

    public void OnPointerExit(PointerEventData eventData)//鼠标离开取消查看物品详情
    {
        InventoryManager.Instance.tooltip.gameObject.SetActive(false);
    }
}

 现在可以显示详情了,但是Tooltip没有跟着我的鼠标来移动,所以接下来我们写移动的方法:

ItemTooltip:

    RectTransform rectTransform;

    private void Awake()
    {
        rectTransform = GetComponent<RectTransform>();
    }
    
    private void Update()
    {
        UpdatePosition();//跟着鼠标更新显示物品详情位置
    }

    public void UpdatePosition()//跟着鼠标更新显示物品详情位置
    {
        Vector3 mousePos = Input.mousePosition;
        rectTransform.position = mousePos;
    }

发现Tooltip在一直闪烁,原因就是因为图片设置在鼠标一起,然后鼠标被遮挡住了,

 在这个方块格子中间的那个原点,也就是锚点,也就是Pivot,为0.5,0.5,那么也就代表:左下角是0,0,中间的点是0.5,0.5,所以它是有4角的范围以及它的坐标的位置的,所以我设置的RectTransform.position就是设置中间锚点所在的位置了,我希望它在鼠标上方,应该将我的鼠标坐标加上一半的高度,同样,如果显示在鼠标的右侧,我也要加上一半的宽度,那么如何获得它的高度和宽度呢?接下来学习一个新的函数方法来获得一个物体的世界坐标的4点位置,那么我们用这2点之间的差就可以获得宽和高了,

 拿到宽和高之后,我们也可以判断,我的Tooltip是否超出了屏幕,如果超出了屏幕我应该反向生成它,我们一起来完成这个代码:

ItemTooltip:

    public void UpdatePosition()//跟着鼠标更新显示物品详情位置
    {
        Vector3 mousePos = Input.mousePosition;

        Vector3[] conors = new Vector3[4];
        rectTransform.GetWorldCorners(conors);//拿到4个点的数组
        //拿到宽和高
        float width = conors[3].x - conors[0].x;
        float height = conors[1].y - conors[0].y;
    }

接下来做一些判断:

我希望实时判断如果我鼠标的坐标跟屏幕之间的距离如果小于Tooltip的宽度的话那么它应该生成在左边,否则生成右边,同理鼠标距离下方之间的高度小于Tooltip的高度的话应该生成在上面,

可以Debug(mousepos.y)知道屏幕坐标是以左下角为0,0的,所以y轴我们之间可以判断当前鼠标y的坐标的高度是否小于Tooltip的高度,如果小于它应该放在上面

ItemTooltip:

    private void OnEnable()
    {
        UpdatePosition();//跟着鼠标更新显示物品详情位置
    }
    private void Update()
    {
        UpdatePosition();//跟着鼠标更新显示物品详情位置
    }

    public void UpdatePosition()//跟着鼠标更新显示物品详情位置
    {
        Vector3 mousePos = Input.mousePosition;

        Vector3[] conors = new Vector3[4];
        rectTransform.GetWorldCorners(conors);//拿到4个点的数组
        //拿到Tooltip的宽和高
        float width = conors[3].x - conors[0].x;
        float height = conors[1].y - conors[0].y;

        if(mousePos.y < height)//判断鼠标高度是否小于Tooltip高度
        {
            rectTransform.position = mousePos + Vector3.up * height * 0.6f;//Tooltip显示在鼠标上面
        }
        else if(Screen.width - mousePos.x > width)//判断鼠标右侧宽度是否大于Tooltip高度
        {
            rectTransform.position = mousePos + Vector3.right * width * 0.6f;//Tooltip显示在鼠标右侧
        }
        else
        {
            rectTransform.position = mousePos + Vector3.left * width * 0.6f;//Tooltip显示在鼠标左侧
        }
    }
}

现在就能正常显示了 

 把背包关闭也希望物品详情也同时关闭:

SlotHolder:

    private void OnDisable()//关闭背包显示,也要取消查看物品详情
    {
        InventoryManager.Instance.tooltip.gameObject.SetActive(false);
    }

 这样就做好物品信息显示栏了

5..Loot Items 掉落物品

现在来完成敌人掉落物品的方法:首先创建一个代码,挂载到所有的敌人身上,让它计算要掉落的是什么:

LootSpawner:

public class LootSpawner : MonoBehaviour
{
    [System.Serializable]
    public class LootItem
    {
        public GameObject item;
        [Range(0, 1)]
        public float weight;
    }

    public LootItem[] lootItems;
}

 LootSpawner:

public class LootSpawner : MonoBehaviour
{
    [System.Serializable]
    public class LootItem
    {
        public GameObject item;
        [Range(0, 1)]
        public float weight;
    }

    public LootItem[] lootItems;

    public void SawnLoot()//生成要掉落的物品
    {
        float currentValue = Random.value;

        for (int i = 0; i < lootItems.Length; i++)
        {
            if (currentValue <= lootItems[i].weight)
            {
                GameObject obj = Instantiate(lootItems[i].item);
                obj.transform.position = transform.position + Vector3.up * 2;
            }
        }
    }
}

EnemyController:

    private void OnDisable()//销毁完成之后执行
    {
        if (!GameManager.IsInitialized) return;
        GameManager.Instance.RemoveObserver(this);//让观察者移除列表

        if(GetComponent<LootSpawner>() && isDead)//死亡掉落物品
        {
            GetComponent<LootSpawner>().SawnLoot();//生成要掉落的物品
        }
    }

 LootSpawner: 

    public void SawnLoot()//生成要掉落的物品
    {
        float currentValue = Random.value;

        for (int i = 0; i < lootItems.Length; i++)
        {
            if (currentValue <= lootItems[i].weight)
            {
                GameObject obj = Instantiate(lootItems[i].item);
                obj.transform.position = transform.position + Vector3.up * 2;
                break;
            }
        }
    }

现在就实现掉落物品了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

unity 3D RPG高级教程(十) 的相关文章

  • 是否可以在 Netbeans 7.0 应用程序中使用 Jzy3D?

    好吧 我们正在尝试将 3D 散点图合并到 Netbeans 7 0 中的项目中 我们选择测试的库之一是 Jzy3D 看起来它会做我们需要它做的一切 但不幸的是 它什么也没做 我已经正确安装了 JOGL 并对其进行了测试 发现它可以正常工作
  • 如何在 JavaFX 中将 GUI 覆盖到 3D 场景上?

    我在 JavaFX 中有一个 3D 场景 需要在 3D 场景上覆盖 GUI 我尝试向场景添加按钮和文本 但它们始终作为 3D 对象出现在 3D 视图中 我环顾四周 没有找到该怎么做 唯一的解决方法是创建一个全新的窗口并将设置放在那里 但在这
  • 将点云转换为深度/多通道图像

    我有一个通过使用立体相机扫描平面生成的点云 我已经生成了法线 fpfh 等特征 并使用这些信息我想对点云中的区域进行分类 为了能够使用更传统的 CNN 方法 我想将此点云转换为 opencv 中的多通道图像 我将点云折叠到 XY 平面 并与
  • 在 Unity 3D 中使用触摸输入在地形上移动相机

    我是 Unity 新手 我正在尝试弄清楚如何使用触摸输入在地图 地形上移动相机 摄像机将以 90 0 0 的旋转角度俯视地形 地形位于第 8 层 我用键盘移动它没有问题 现在我尝试移动到触摸 如果你想在 iOS 上保持预期的使用情况 那就非
  • 编写每个三角形/面具有纯色的 GLSL 片段着色器的方法

    我有顶点和三角形数据 其中包含每个数据的颜色triangle 面 不是每个顶点 即单个顶点由多个面共享 每个面可能具有不同的颜色 我应该如何在 GLSL 中解决这个问题以获得每个的纯色分配face正在渲染 通过平均顶点相邻多边形的颜色来计算
  • 提取给定 2D 图像点、深度图和相机校准矩阵的 3D 坐标

    我有一套2D image输出的关键点OpenCV FAST角点检测功能 使用Asus Xtion I还有一个时间同步的深度图 其中所有相机校准参数都是已知的 使用这些信息我想提取一组3D坐标 点云 在OpenCV 任何人都可以给我任何有关如
  • WPF 3D 旋转球体 GUI

    我一直在尝试在 WPF 中为我的课堂作业制作 3D 用户界面 但遇到了一个问题 现在 2 3 天都无法解决 我尝试用谷歌搜索答案 我查看了一些 stackoverflow 帖子 但还没有一个可以帮助我解决问题 情况是这样的 我有一个 3D
  • 从 NumPy 数组中的数据绘制 3D 图像

    我有一个 NumPy 数组中的数据文件 我想查看 3D 图像 我正在分享一个示例 我可以在其中查看大小为 100 100 的 2D 图像 这是 xy 平面上 z 0 处的切片 import numpy as np from matplotl
  • 可点击的精灵标签?

    我一直在玩精灵文本标签 更具体地说是这个例子 http stemkoski github io Three js Sprite Text Labels html http stemkoski github io Three js Sprit
  • OpenGL Z 偏置(多边形偏移)限制

    我有两个共面的多边形 我尝试做 glEnable GL POLYGON OFFSET FILL glPolygonOffset 0 1 并期望其中一个明显 位于 另一个之上 这种情况直到大约 70 75 个单位之外 近剪裁平面为 1 远剪裁
  • 使用 ThreeJS 获取球体纹理上的点击位置

    目前 我有一个带有纹理的球体 它绕 y 轴旋转 我还有在 3D 空间中单击的位置 以及球体上的旋转位置 我认为 目标 获取纹理上的位置 例如 我想获取我点击的图像的哪个方块 参见示例球体和下图 在实践中 我不会使用此图像 但我觉得这将是一个
  • C++ Irrlicht 程序未链接:“未定义对‘__imp_createDevice’的引用”

    我的 Irrlicht 程序无法链接 我使用的编译器是g Code include
  • 投影 3D 网格的 2D 轮廓算法

    给定 一个 3D 网格 由一组顶点和三角形定义 并用这些点构建网格 问题 找到任意平面上投影的任意旋转网格的二维轮廓 投影很容易 挑战在于找到平面中投影三角形边的 外壳 我需要一些有关研究该算法的输入 指针的帮助 为简单起见 我们可以假设
  • 使用 Scipy/Numpy 在浊点的二维插值中仅获取“有效”点

    我有一个通过人的背部摄影测量获得的浊点 我正在尝试对其进行插值以获得规则网格 为此我正在使用scipy interpolate到目前为止取得了良好的成果 问题是 我正在使用的函数 scipy interpolate griddata 使用平
  • 不明确的 OpenGL 默认相机位置

    在我的Opengl程序中 在我应用透视投影矩阵之前 每当我绘制一些对象时 我都会在世界坐标系的原点处绘制它 但是几乎所有Opengl教程都指出相机 我的投影视图 位于原点朝向正 z 轴 这取决于您稍后如何处理投影矩阵中的 z 值 但是如果这
  • 将 3D 场景导入babylonJS

    所以我今天读到巴比伦JS http blogs msdn com b eternalcoding archive 2013 06 27 babylon js a complete javascript framework for build
  • DirectX::SpriteFont/SpriteBatch 阻止 3D 场景绘制

    我使用时遇到问题DirectX SpriteFont DirectX SpriteBatch 来自 DirectXTK 与此处讨论的问题完全相同 使用 SpriteFont 类绘制文本时出现问题 https stackoverflow co
  • 3D 空间中两个盒子之间的交集

    我想为我的图形引擎实现一个碰撞检测系统 我不知道这是否是常见的方法 但我的想法是将任何实体对象 如网格或相机 绑定在 3D 盒子内 这会给我比球体更准确的结果 这个盒子由八个顶点定义 x0 min vertices x off parsin
  • 为什么我的 3D 绘图没有显示在 R Studio 绘图查看器中?

    我通常在 RStudio 版本 1 0 44 中查看绘图时没有问题 但是当我尝试查看使用 rgl 包创建的 3D 绘图时 我的 RStudio 绘图查看器中什么也没有出现 我能够毫无问题地绘制图 汽车 散点图 这是我正在使用的代码 inst
  • 求截头棱锥体/截棱锥体横截面的边长

    如何找到横截面的边长 如图所示 下图 横截面 红色 截头锥体 截棱锥体 我知道顶部和底部的边长 以及底部的高度 截锥体和到横截面的距离 此外我还知道 顶部和底部底座平行 并且顶部和底部的中心 底部底座直接位于彼此之上 比例是线性的 因此只需

随机推荐

  • LeetCode05:最长回文数组

    题目 给定一个字符串 s 找到 s 中最长的回文子串 你可以假设 s 的最大长度为 1000 示例1 输入 babad 输出 bab 注意 aba 也是一个有效答案 示例2 输入 cbbd 输出 bb 详解 在完成算法的编程时 设计算法是至
  • PHP学习笔记——加密解密

    一 MD5算法 MD5消息摘要算法 Message Digest Algorithm 是R Rivest设计的 它对输入的任意长度的消息进行运算 产生一个128位的消息摘要 随着穷举攻击和密码分析的发展 MD5算法已经不再那么流行了 1 算
  • python读取json格式数据

    python读取json格式数据 import json import os import pandas as pd def get json file self file path 读取json格式数据 cur dir join os p
  • Servlet+JDBC实战开发书店项目讲解第七篇:模拟支付

    Servlet JDBC实战开发书店项目讲解第七篇 模拟支付 概述 在本篇文章中 我们将使用Servlet和JDBC来完成书店项目中的模拟支付功能 我们将介绍实现思路 后端代码设计以及前端代码设计 并通过代码实现订单支付成功 并实现查看未付
  • 【CSS】4步教你绘制爱心图案

    实现原理 所谓爱心是指同情怜悯之心态 包括相应的一定行动 它是一种奉献精神 更是关怀 爱护人的思想感情 包括于所有情感之中 今天就用CSS实现一个爱心图案 绘制一个正方形 利用伪元素绘制2个圆形 利用transform移动2个圆形拼成爱心
  • tracert与traceroute命令详解

    tracert 一 tracert 介绍 tracert 是一个简单的网络诊断工具 用于确定 IP 数据报访问目标所经过的路径 Tracert 命令用 IP 生存时间 TTL 字段和 ICMP 错误消息来确定从一个主机到网络上其他主机的路由
  • 基于Matlab的深度学习LSTM模型时间序列多步预测——多对单

    LSTM在时间序列预测方面的应用非常广 但有相当一部分没有考虑使用多长的数据预测下一个 类似AR模型中的阶数P 我基于matlab2021版编写了用LSTM模型实现多步预测时间序列的程序代码 可以自己调整使用的数据 阶数 序列数据是我随机生
  • java ---- 逻辑控制

    目录 一 顺序结构 二 分支结构 1 if 结构 2 switch结构 三 循环结构 1 while结构 2 休息并继续 3 for结构 4 do while结构 四 输入和输出 3个输出 从键盘输入 循环输入 一 顺序结构 按照代码书写的
  • 9.荔枝派 zero(全志V3S)-移植最新版Uboot

    上面是我的微信和QQ群 欢迎新朋友的加入 1 获取源码 https gitlab denx de u boot u boot 文件拉下来要花点时间 将老版本的配置文件拷贝过来 编译 生成UBoot的bin文件和设备树文件 make ARCH
  • 二、TCP/IP协议之网络接口层(MAC地址、CSMA/CD、ARP协议)

    2 2 网络接口层 2 2 1 相关介绍 TCP IP模型的网络接口层实际上没有规定任何具体的协议 各物理网络可以使用自己的物理层协议和数据链路层协议 仅仅提供一个各种网络和TCP IP接口的要求 在TCP IP模型中 网络接口层对应ISO
  • git 命令行 创建分支_从命令行创建Git补丁

    git 命令行 创建分支 如果您不想执行常规的提交 请求 请求流程 Git修补程序是将更改应用于项目的一种简便方法 补丁是包含等效Git提交差异的文件 您可以使用git diff创建修改后的工作状态补丁 diff输出采用正确的补丁格式 gt
  • Python vitualenv环境下用pyinstaller打包exe程序,及报错解决:No module named ‘sklearn.metrics,xgboost.libpath

    问题 之前直接用命令打包 默认的是系统的python环境 没有用到虚拟环境 打包出来会特别大一个多G 1 cd E Users 13626 PycharmProjects pythonProject3 venv Scripts 虚拟环境项目
  • Hadoop分布式集群时间同步(ntp)配置

    目录 时间服务器配置 必须root用户 1 查看所有节点ntpd 时间服务器 服务状态和开机自启状态 2 修改hadoop102的ntp conf配置文件 3 重新启动ntpd服务并设置开机自启 配置其他服务器 1 关闭所有节点上的ntpd
  • vm options什么意思_什么是锂电池保护板,保护板的基础知识和不良分析!

    点击上面 电动知家 可以订阅哦 锂电池保护板是对串联锂电池组的充放电保护 在充满电时能保证各单体电池之间的电压差异小于设定值 一般 20mV 实现电池组各单体电池的均充 有效地改善了串联充电方式下的充电效果 同时检测电池组中各个单体电池的过
  • SiriKit 新变化:让 Intent 更强大

    Python实战社群 Java实战社群 长按识别下方二维码 按需求添加 扫码关注添加客服 进Python社群 扫码关注添加客服 进Java社群 作者 wiilen iOS 开发者 来源丨老司机技术周报 ID LSJCoding Sessio
  • mysql 视图的作用

    转自 http blog csdn net fm0517 article details 5625949 视图是从一个或几个基本表 或视图 导出的表 它与基本表不同 是一个虚表 数据库只存放视图的定义 而不存放视图对应的数据 这些数据仍存放
  • JS赋值运算符详解

    赋值运算符左侧的操作数必须是变量 对象属性或数组元素 也称为左值 例如 下面的写法是错误的 因为左侧的值是一个固定的值 不允许操作 1 100 返回错误 赋值运算有以下两种形式 简单的赋值运算 把等号右侧操作数的值直接复制给左侧的操作数 因
  • [下载演讲稿]数字藏品与元宇宙存储—数字新世界的“土壤”

    和上次 下载 元宇宙存储 演讲稿 相比 增加了 1 两厅印发的 关于推进实施国家文化数字化战略的意见 对数字藏品的发展有积极促进作用 2 NFT和数字藏品的分类 新玩法 高质量体验 守诺 受朱嘉明老师 朱嘉明 数字经济和非同质时代 NFT
  • Java BigInteger的使用

    前言 在Java中 由CPU原生提供的整型最大范围是64位 long 型整数 使用 long 型整数可以直接通过CPU指令进行计算 速度非常快 但是如果我们使用的整数范围超过了 long 型怎么办 这个时候 就只能用软件来模拟一个大整数 j
  • unity 3D RPG高级教程(十)

    目录 声明 1 Action Button 快捷栏按键 2 Stats Info 显示 Player 相关信息 3 Change Animator 切换动画控制器 4 Item Tooltip 物品信息显示栏 5 Loot Items 掉落