Unity随手问题记录(持续更新~~)

news2024/11/25 5:18:01

目录

1.将摄像机定位到模型实际中心点前边(防止有些模型中心点和实际模型中心位置偏移很大的情况)

2.获取当鼠标在RawImage上时,鼠标位置对应的图像坐标(简单粗暴方式)

3.设置脚本运行顺序

4.当plugins底下出现dll文件识别不到的情况(主要出现在2018版本)

5.[优化]Unity中的阴影优化方案

1.无阴影

2.脚底假阴影

3.Unity系统的实时阴影

4.软阴影

6.关于MaterialPropertyBlock

7.关于拖动文件到Unity主窗口的相关方法

8.快速让物体生成镜像的做法(面试问过这个)

9.在 OnSceneGUI and OnInspectorGUI 方法之间共享变量

10.设置cullingMask为Everything的简单方式

11.前向渲染路径中的一些细节(Forward Rendering)

12.关于Application.targetFrameRate

13.为什么不能直接更改transform.position.x的值?

14.自动检测UI内容是否显示全:content size filter控件

15.光照计算中的diffuse的计算公式

16.法线贴图的原理,以及它为什么偏淡蓝色

17.记录一个个人使用比较好用的相机控制脚本


1.将摄像机定位到模型实际中心点前边(防止有些模型中心点和实际模型中心位置偏移很大的情况)

 public static void FitToBounds(this Camera camera, Transform transform, float distance)
        {            
            var bounds = transform.EncapsulateBounds();
            var boundRadius = bounds.extents.magnitude;
            
            //根据摄像机视角计算摄像机位置
            var finalDistance = boundRadius/(2.0f*Mathf.Tan(0.5f*camera.fieldOfView*Mathf.Deg2Rad))*distance;
            if (float.IsNaN(finalDistance))            
                return; 
            camera.transform.position = new Vector3(bounds.center.x, bounds.center.y, bounds.center.z + finalDistance);
            camera.transform.LookAt(bounds.center);
        }
        
        public static Bounds EncapsulateBounds(this Transform transform)
        {
            Bounds bounds;
            var renderers = transform.GetComponentsInChildren<Renderer>();
            if (renderers !=  null && renderers.Length > 0)
            {
                bounds = renderers[0]. bounds;
                for (var i = 1; i < renderers.Length; i++)
                {
                    var renderer = renderers[i];
                    bounds.Encapsulate(renderer.bounds);
                }
            } else
            {
                bounds = new Bounds();
            }
            return bounds;
        }

2.获取当鼠标在RawImage上时,鼠标位置对应的图像坐标(简单粗暴方式)

Vector3[] corners = new Vector3[4];
GetComponent<RawImage>().rectTransform.GetWorldCorners(corners);
Rect newRect = new Rect(corners[0], corners[2]-corners[0]);
Debug.Log(newRect.Contains(Input.mousePosition));

3.设置脚本运行顺序

[DefaultExecutionOrder(int order)]

order值越小运行顺序越靠前(一般想要某个脚本最先运行要设置一个负值)

4.当plugins底下出现dll文件识别不到的情况(主要出现在2018版本)

public class MyPluginClass
{
    //
    static MyPluginClass()
    {
        String currentPath = Environment.GetEnvironmentVariable("PATH", EnvironmentVariableTarget.Process);
        String dllPath = Environment.CurrentDirectory + Path.DirectorySeparatorChar + "Assets" + Path.DirectorySeparatorChar + "Plugins";
        if(currentPath.Contains(dllPath) == false)
        {
            Environment.SetEnvironmentVariable("PATH", currentPath + Path.PathSeparator + dllPath, EnvironmentVariableTarget.Process);
        }
    }
}

5.[优化]Unity中的阴影优化方案

1.无阴影

对于一些重要性很低或者很难被注意到的,当然大多数情况下是硬件设备配置达不到要求而采用低配画质设置的,这种情况下直接不产生任何阴影,虽然这看起来会让玩家觉得不那么真实,但是为了能让低端机上能够保持一定的帧率运行,这样是不可避免的

2.脚底假阴影

fake_shadow,脚底的阴影贴图,为所有需要添加假阴影的人物,脚底添加假阴影预制体,实时跟随人物移动,开销只是一张贴图的开销,但不太适用于移动的NPC或者怪物,毕竟游戏中地形高低起伏,一张贴图可能会产生穿帮,所以为静止的NPC使用这种较为合适

3.Unity系统的实时阴影

在有光源并勾选了Cast Shadow的情况下,物体会投射阴影,勾选了Receive Shadow的物体表面会接收到投射的阴影,由于阴影是实时的,一般移动的物体使用这个效果会比较好,但同时这个开销也是不可避免的。unity自带的shadowmap阴影基于深度,需要浮点纹理的支持,但是有的移动平台不支持,而且开销很大。

shadowMap的阴影实现原理:将相机放在和光源重合的位置上,那么场景中相机看不到的地方就是光源的阴影区域,然后通过相机将这个阴影映射纹理存储,可以每次采样得到某个方向距离光源最近的点(比这个点远则说明在阴影中)

4.软阴影

何为软阴影,游戏引擎中的阴影为实时的数学计算,投射出的阴影都是有棱有角,在阴影和非阴影的边界也是区分明显,而真实世界中则不是这样,真实世界中的阴影收到间接光照等的影响,在阴影边缘形状往往不那么锋利,而且往往过渡平滑。那么如何在引擎中实现这一技术,近几年大火的实时光照追踪技术,即将一束光的第一次,第二次甚至更多反射的影响都计算上去,得到更为真实的渲染效果,不过这一过程计算复杂,开销往往也比较大。

6.关于MaterialPropertyBlock

使用Unity3D做开发的朋友应该都知道,对于实例化出来的模型,我们改变它身上的颜色值或者贴图之类,Unity是会把它当前使用的ShareMaterial复制一份实例出来,以做到不同对象身上的材质互不影响的改变参数。但这样做会导致如果使用的对象很多,就会产生很多材质的实例的问题,这样会对GC有一定的消耗。但是如果使用MaterialPropertyBlock,没有生成任何的Material的实例出来:

  void ChangeColor()
    {
        if (rootObj == null)
        {
            return;
        }

        Transform[] ts = rootObj.GetComponentsInChildren<Transform>();
         objects = new GameObject[ts.Length];
        for (int i = 0; i < ts.Length; i++)
        {
            objects[i] = ts[i].gameObject;
        }

        MaterialPropertyBlock props = new MaterialPropertyBlock();
        MeshRenderer renderer;
        foreach (var obj in objects)
        {
            float r = Random.Range(0.0f, 1.0f);
            float g = Random.Range(0.0f, 1.0f);
            float b = Random.Range(0.0f, 1.0f);
            props.SetColor("_Color",new Color(r,g,b));

            renderer = obj.GetComponent<MeshRenderer>();
            if (renderer == null)
            {
                continue;
            }
            renderer.SetPropertyBlock(props);
        }
    }

7.关于拖动文件到Unity主窗口的相关方法

https://github.com/Bunny83/UnityWindowsFileDrag-Drop

8.快速让物体生成镜像的做法(面试问过这个)

调整scale为 "原scale值 * (-1)" 即可。

9.在 OnSceneGUI and OnInspectorGUI 方法之间共享变量

之前这两个方法可以共享全局变量,但是突然在某一个版本没用了。现在需要在全局变量其那边加Static标识才行。

10.设置cullingMask为Everything的简单方式

camera.cullingMask = -1; // -1 means "Everything"

11.前向渲染路径中的一些细节(Forward Rendering)

在 Forward Rendering 中作用在每个物体上一定数量最亮的光,被渲染在全逐像素(per-pixel)光照模式下。然后最多4个点光源会被逐顶点(per-vertex)计算。其他的光照被作为 Spherical Harmonics (SH) (球谐光照)计算, 它很快但是只是一个近似值。一个光源是否为一个逐像素光照取决于下:

  • 光源的 Render Mode 被设置为 Not Important 永远是 per-vertex or SH.
  • 最亮的平行光永远是 per-pixel.
  • 渲染模式被设置为 Important 的光永远是per-pixel。
  • 如果符合上述条件的光的数量,小于当前 Pixel Light Count Quality Setting,那么更多的光会被渲染为 per-pixel,根据光照亮度的顺序由高到低。

12.关于Application.targetFrameRate

1.使用VR设备时,会使用VR SDK所指定的相应帧率,会忽略掉游戏中指定的值。(设置无效)

2.当设置了vSyncCount属性(垂直同步),将使用vSyncCount和平台的默认渲染率来确定目标帧率,会忽略targetFrameRate。例如,如果平台的默认渲染速度是每秒60帧,而vSyncCount被设置为2,那么游戏的目标就是每秒30帧。

13.为什么不能直接更改transform.position.x的值?

这是c#中的结构体当作返回值的问题,结构体是值类型,而值传递是复制传递,所以返回的值不是原来的值了,对此返回值的修改是无效的,所以编译器就从源头上禁止了这样的操作。 

14.自动检测UI内容是否显示全:content size filter控件

15.光照计算中的diffuse的计算公式

diffuse = Kd * lightColor * max(dot(N, L), 0)

其中:

Kd是材质的漫反射颜色。

lightColor是入射漫反射光的颜色。

N是规范化的表面法向量。

L是规范化的从顶点到光源的向量。

16.法线贴图的原理,以及它为什么偏淡蓝色

逐像素计算光照时,我们每一个像素都会根据该点的法向量来计算最终该点的光照结果,那么,我们如果能够改变这个法线的方向,不是就可以改变这个点的光照结果了呢!那么,把纹理采样的思想用在这里,我们直接用一张图来存储法线,逐像素计算时,在采样diffuse贴图的时候,再采样一张法线的贴图,就可以修改法线了,进而修改最终的效果。

既然我们知道了法线贴图中存储的是切线空间的法线。而法线贴图所对应的表面,绝大部分的位置肯定是平滑的,只有需要凹凸变化的地方才会有变化,那么大部分地方的法线方向不变,也就是在切线空间的(0,0,1),这个值按照上面介绍的映射关系,从(-1,1)区间变换到(0,1)区间:(0*0.5+0.5,0*0.5+0.5,1*0.5+0.5)= (0.5,0.5,1),再转化为颜色的(0,255)区间,最终就变成了(127,127,255)。好了,打开photoshop,看一下这个颜色值是 不是偏向蓝色。

17.记录一个个人使用比较好用的相机控制脚本

using System.Collections;
using System.Collections.Generic;
using TriLib.Samples;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class CameraController : MonoBehaviour
{

  public bool AllowMouseScrollWheel;

    [SerializeField]
    private AssetLoaderWindow AssetLoader;

    private float oriOffsetDistance;

    public KeyCode moveForwardKey;
    public KeyCode moveBackKey;
    public KeyCode moveLeftKey;
    public KeyCode moveRightKey;
    public KeyCode moveUpKey;
    public KeyCode moveDownKey;

    public float distance = 5.0f;
    public float maxDistanceToDevice;
    public float minDistanceToDevice;
    public float xSpeed = 200.0f;
    public float ySpeed = 200.0f;
    public int yMinLimit = -80;
    public int yMaxLimit = 80;
    public int zoomRate = 40;
    public float zoomDampening = 5.0f;

    public Transform mainCameraTrans;
    public GameObject TargetGameObject;

    private float mouse_x;
    private float mouse_y;
    private float xDeg = 0.0f;
    private float yDeg = 0.0f;
    private float currentDistance;
    private float desiredDistance;
    private Quaternion currentRotation;
    private Quaternion desiredRotation;
    private Quaternion rotation;
    private Vector3 position;

    private bool dragging = false;
    private float pinchdistance = 0;

    private EventSystem eventsystem;

    // Start is called before the first frame update
    void Start()
    {
        mainCameraTrans = this.GetComponent<Camera>().transform;
        eventsystem = FindObjectOfType<EventSystem>() as EventSystem;;
    }

    public void InitCamera(GameObject targetGameObject)
    {
        distance = Vector3.Distance(transform.position, targetGameObject.transform.position);
        currentDistance = distance;
        desiredDistance = distance;

        //be sure to grab the current rotations as starting points.
        position = transform.position;
        rotation = transform.rotation;
        currentRotation = transform.rotation;
        desiredRotation = transform.rotation;
        Vector3 cross = Vector3.Cross(Vector3.right, transform.right);
        xDeg = Vector3.Angle(Vector3.right, transform.right);
        if (cross.y < 0) xDeg = 360 - xDeg;
        yDeg = Vector3.Angle(Vector3.up, transform.up);
    }

    // Update is called once per frame
    void LateUpdate()
    {
        TargetGameObject = AssetLoader.CenterPointObj;
        //CheckOffsetCameraMouseRay();
        if (AllowMouseScrollWheel&&DropToWindow.Instance.IsCompleteLoaded)
        {
            float moveAmountX = xSpeed * Time.deltaTime;
            float moveAmountY = ySpeed * Time.deltaTime;

            //  CheckOffsetCameraMouseRay();
            //if (EventSystem.current.IsPointerOverGameObject())
            //    return;

            if (Input.GetKey(moveForwardKey))
            {
                if (!CheckIfLessThanDistance())
                    mainCameraTrans.position += mainCameraTrans.forward * moveAmountX;
            }
            else if (Input.GetKey(moveBackKey))
            {
                if (!CheckIfMoreThanDistance())
                    mainCameraTrans.position -= mainCameraTrans.forward * moveAmountX;
            }
            else if (Input.GetKey(moveLeftKey))
            {
                if (!CheckIfMoreThanDistance())
                    mainCameraTrans.position -= mainCameraTrans.right * moveAmountX;
            }
            else if (Input.GetKey(moveRightKey))
            {
                if (!CheckIfMoreThanDistance())
                    mainCameraTrans.position += mainCameraTrans.right * moveAmountX;
            }
            else if (Input.GetKey(moveUpKey))
            {
                if (!CheckIfMoreThanDistance())
                    mainCameraTrans.position += mainCameraTrans.up * moveAmountY;
            }
            else if (Input.GetKey(moveDownKey))
            {
                if (!CheckIfMoreThanDistance())
                    mainCameraTrans.position -= mainCameraTrans.up * moveAmountY;
            }

            bool outsideNewGUI = true;
            if (eventsystem) outsideNewGUI = !eventsystem.IsPointerOverGameObject();

            if (Input.GetMouseButton(1))
            {
                if (!Input.GetMouseButtonDown(1))
                {

                    xDeg += Input.GetAxis("Mouse X") * xSpeed * 0.02f;
                    yDeg -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;

                    OrbitAngle

                    //Clamp the vertical axis for the orbit
                    yDeg = ClampAngle(yDeg, yMinLimit, yMaxLimit);
                    // set camera rotation 
                    desiredRotation = Quaternion.Euler(yDeg, xDeg, 0);
                    //currentRotation = transform.rotation;
                    //rotation = Quaternion.Lerp(currentRotation, desiredRotation, Time.deltaTime * zoomDampening);
                    //transform.rotation = rotation;
                }
            }

            currentRotation = transform.rotation;
            rotation = Quaternion.Lerp(currentRotation, desiredRotation, Time.deltaTime * zoomDampening);
            transform.rotation = rotation;

            float scrollinp = Input.GetAxis("Mouse ScrollWheel");


            desiredDistance -= scrollinp * Time.deltaTime * zoomRate * Mathf.Abs(desiredDistance);
            //clamp the zoom min/max
            desiredDistance = Mathf.Clamp(desiredDistance, minDistanceToDevice, maxDistanceToDevice);
            // For smoothing of the zoom, lerp distance
            currentDistance = Mathf.Lerp(currentDistance, desiredDistance, Time.deltaTime * zoomDampening);
            //currentRotation = transform.rotation;
            //rotation = Quaternion.Lerp(currentRotation, desiredRotation, Time.deltaTime * zoomDampening);
            //transform.rotation = rotation;

            // calculate position based on the new currentDistance 
            position = TargetGameObject.transform.position - (rotation * Vector3.forward * currentDistance );
            transform.position = position;
        }
    }

    bool CheckIfMoreThanDistance()
    {
        //if (mainCameraTrans == null)
        //    mainCameraTrans = Camera.main.transform;

        GameObject t = AssetLoader.CenterPointObj;
        if (t == null)
            return false;

        if (Vector3.Distance(mainCameraTrans.position,
                t.transform.position) > maxDistanceToDevice)
            return true;
        return false;
    }

    bool CheckIfLessThanDistance()
    {
        GameObject t = AssetLoader.CenterPointObj;
        if (t == null)
            return false;

        //if (mainCameraTrans == null)
        //    mainCameraTrans = Camera.main.transform;
        if (Vector3.Distance(mainCameraTrans.position,
                t.transform.position) < minDistanceToDevice)
            return true;
        return false;
    }

    private static float ClampAngle(float angle, float min, float max)
    {
        if (angle < -360)
            angle += 360;
        if (angle > 360)
            angle -= 360;
        return Mathf.Clamp(angle, min, max);
    }
}

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

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

相关文章

LeetCode 1110. Delete Nodes And Return Forest【二叉树,DFS,哈希表】中等

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

SKD240

SKD240 系列智能电力仪表 SKD240 系列智能电力仪表是陕西斯科德智能科技有限公司自主研发、生产的。 产品概述 - 点击了解详情 SKD240采用先进的微处理器和数字信号处理技术&#xff08;内置主芯片采用32位单片机, 采用32位浮点型真有效值处理数据&#xff09;&#xff0c;测量…

图像采集卡的基本原理、应用领域和发展趋势

图像采集卡是一种硬件设备&#xff0c;用于将模拟视频信号转换为数字信号&#xff0c;并将其传输到计算机中进行处理和存储。它通常用于监控、视频会议、医学图像等领域。本文将介绍图像采集卡的基本原理、应用领域和发展趋势。 一、图像采集卡的基本原理 图像采集卡的基本原…

视频里的声音怎么转换成音频?

视频里的声音怎么转换成音频&#xff1f;这样我们就能把视频里的想要的声音在其他音频平台播放或是用于其他视频。其实视频提取音频是一种将视频文件中的音频数据分离出来的技术。该技术可以将视频中的音频转换为不同的格式&#xff0c;让我们可以在无需视频的情况下使用音频文…

Web 应用程序防火墙 (WAF) 相关知识介绍

Web应用程序防火墙 (WAF) 如何工作&#xff1f; Web应用防护系统&#xff08;也称为&#xff1a;网站应用级入侵防御系统。英文&#xff1a;Web Application Firewall&#xff0c;简称&#xff1a;WAF&#xff09;。利用国际上公认的一种说法&#xff1a;Web应用防火墙是通过执…

【Zero to One系列】在WSL linux系统上,使用docker运行Mysql与Nacos,以及如何启动与停止WSL

前期回顾&#xff1a; 【Zero to One系列】window系统安装Linux、docker 1、下载docker-compose 1.下载&#xff1a; curl -SL https://github.com/docker/compose/releases/download/v2.17.2/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose 2.授予权限&a…

大数据治理入门系列:元数据管理

在介绍数据治理一文中&#xff0c;我们曾用在图书馆找书的例子解释为什么需要进行数据治理。数据治理在某种程度上类似于图书管理。元数据管理作为数据治理的重要一环&#xff0c;也可以进行这种类比。 在图书管理过程中&#xff0c;需要根据相应的制度购买、记录、存放、借还…

【LeetCode: 486. 预测赢家 | 暴力递归=>记忆化搜索=>动态规划 】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

【T+】畅捷通T+设置收入成本配比结转

【问题需求】 收入成本配比原则是指&#xff1a; 取得的销售收入应与为取得该收入所发生的成本相匹配&#xff0c; 即先出库后销货时需要等收到销售发票才能确认成本&#xff0c; 先销货后出库时要先确认虚拟成本。 【解决方案】 重点&#xff1a;业务流程选择【单据立账】的情…

ArcGis系列-java发布空间表为地图服务(map)

1,实现思路 使用java调用cmd命令执行python脚本python环境使用arcgis pro安装目录下的 \ArcGIS\Pro\bin\Python\envs\arcgispro-py3作为地图服务应该可以支持添加样式文件发布表需要用到sde文件,使用java创建sde的代码可以看这里发布表时,先在本地的空项目模板中添加数据库表作…

vue模拟el-table演示插槽用法

vue模拟el-table演示插槽用法 转载自&#xff1a;www.javaman.cn 很多人知道插槽分为三种&#xff0c;但是实际到elementui当中为什么这么用&#xff0c;就一脸懵逼&#xff0c;接下来就跟大家聊一聊插槽在elementui中的应用&#xff0c;并且自己写一个类似el-table的组件 vue…

回归问题里的数学

假设一个简单的案例 投入的广告费越多&#xff0c;广告的点击量就越高&#xff0c;进而带来访问数的增加&#xff0c;不过点击量经常变化&#xff0c;投入同样的广告费未必能带来同样的点击量。根据广告费和实际点击量的对应关系数据&#xff0c;可以将两个变量用下面的图展示…

CASA模型:生态系统NPP及碳源、碳汇模拟、土地利用变化、未来气候变化、空间动态模拟

查看原文>>>生态系统NPP及碳源、碳汇模拟、土地利用变化、未来气候变化、空间动态模拟实践技术应用 目录 第一章 CASA模型介绍&#xff08;讲解案例实践&#xff09; 第二章 CASA初步操作 第三章 CASA数据制备&#xff08;一&#xff09; 第四章 CASA数据制备&am…

4_回归算法(算法原理推导+实践)

文章目录 1 线性回归1.1 定义1.2 题目分析1.3 误差项分析1.4 目标函数推导1.5 线性回归求解1.6 最小二乘法的参数最优解 2 目标函数&#xff08;loss/cost function&#xff09;3 模型效果判断4 机器学习调参5 梯度下降算法5.1 梯度方向5.2 批量梯度下降算法&#xff08;BGD&am…

Spring IOC容器及DI相关概念

文章目录 一、组件、框架、容器的相关概念1.组件2.框架3.容器4.总结 二、IOC与DI简介1.IOC入门案例2.DI入门案例 一、组件、框架、容器的相关概念 1.组件 组件是为了代码的重用而对代码进行隔离封装&#xff0c;组件的呈现方式是单个或多个.class文件&#xff0c;或者打包的.…

Flutter的手势识别功能实现GestureDetector

GestureDetector简介 GestureDetector 是 Flutter 中一个非常常用的小部件&#xff0c;它提供了许多手势识别的功能&#xff0c;包括点击、双击、长按、拖动、缩放等等。 使用方法 GestureDetector 可以包裹其他部件&#xff0c;当用户在这些部件上进行手势操作时&#xff0…

基于SSM的网辩平台的设计与实现

摘 要 线上作为当前信息的重要传播形式之一&#xff0c;线上辩论系统具有显著的方便性&#xff0c;是人类快捷了解辩论信息、资讯等相关途径。但在新时期特殊背景下&#xff0c;随着网辩的进一步优化&#xff0c;辩论赛结合网络平台融合创新强度也随之增强。本文就网辩平台进…

尧泰汉海五城联动,“益”起圆梦!用爱守护成长,助力502名孩子实现心愿

公益的力量让孩子们的梦想被看见。 文具套装、书包、篮球 、益智积木、生日蛋糕......一个个看似小小的心愿&#xff0c;对于城市里的孩子来说是平常不过的礼物&#xff0c;但却成了许多正处于困境孩子的期待。 本次活动由重庆市慈善总会指导&#xff0c;Home尧泰汉海慈善专项…

【项目】ROS下使用乐视深度相机LeTMC-520

本文主要记录如何在ros下使用乐视深度相机。乐视三合一体感摄像头LeTMC-520其实就是奥比中光摄像头&#xff08;Orbbec Astra Pro&#xff09; 系统&#xff1a;Ubuntu20.04 这款相机使用uvc输入彩色信息&#xff0c;需要使用libuvc、libuvc_ros才能在ROS上正常使用彩色功能。…

k8s实战2-用minikube发布本地应用

官网的教程中&#xff0c;hello-minikube其镜像都在网上(dockerhub)上&#xff0c;如何把本地打包的docker镜像发布到minikube中 1 终端上运行eval $(minikube docker-env) 此命令的作用是使用Minikube Docker守护进程&#xff0c;跟原来docker desktop的docker进程区别开来 …