IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 基础-Unity蒙版替换 -> 正文阅读

[游戏开发]基础-Unity蒙版替换

在网上逛面试题的时候看到这样一道题

  • 给三张图片a,b,c

  • 有三个按钮x,y,z,分别对应涂抹的颜料a,b,c

  • 用鼠标在图片上进行涂抹,如果选择的是x,则在原来的图片上涂上a图片对应位置像素的颜色

看起来很简单,但是很多Unity基本的东西自己都忘了,导致中间遇到很多小坑

参考

作者:XMMATRIX ??

链接:https://www.zhihu.com/question/393755789/answer/1229796849

自己把这位仁兄的实现方法自己跑了一遍,遇到一些基础的问题,重新总结一番。

实现

  • 创建一个plane(思路是因为要获得位置,所以想到要射线检测)

    • 上面挂一个脚本DrawPlane,用于检测鼠标按下,并修改ColorTexture的A值

    • 使用自己的Shader的Material,Shader包含四张图大小相同的图

      • 一张(1,1,1,A)的透明通道贴图ColorTexture,在Fragemnt根据A值决定显示那张Texture

      • 三张要显示的图片

逻辑上很简单,但是要实现起来有很多Unity的东西自己不熟悉,

问题

1.如何根据鼠标按下获得要修改的像素的位置,如何修改texture的像素值

  • 射线检测

    Ray ray = Camera.main.ScrennPostoRay(Input.mousePosition);
    RaycastHit hit;
    if(Phyic.raycast(ray, out hit))
    {
        
    }
  • 读取hit信息

    Vector2Int o = new Vector2Int(picwidth * hit.texcoord.x, picheight * hit.texcoord.y);
    for(int i = -radius; i < radius; i++)
        for(int j = -radius; j < radius; j++)
        {
            if(i*i+j*j < radius*radius)
            {
                ColorTexture.SetPixel(o.x + i,o.y + j, 
                                            new Color(0,0,0,1) * picIndex);
            }
        }
    ColorTexture.Apply();
    • hit.texcoord只有在射线检测时和MechCoilder碰撞后才会正确和获得,获得的是碰撞位置相对于碰撞物体的uv值。(类似于The Book of Shader 中的u_mouse)

    • 修改Texture的像素值用SetPixel(int x, int y, Color color);同时修改之后需要Apply();一下

2.如何添加按钮事件来修改pictexture值

在Canvas上挂一个脚本,

GameObject btn_1 = GameObject.Fine("Canvas/MyButton");
Button = btn_1.GetComponent<Button>();
?
btn_1.OnClick.AddListener(delegate()
{
    GameObject plane = GameObject.Fine("DrawPlane");
    plane.GetComponent<DrawPlane>().setpicIndex(btn_1Index);
})

C# 委托 Delegate

  • 类似于函数指针

  • 有多播属性,可以让两个委托相加,从而执行两个函数,但是返回值只会返回最后一个加进去的函数的返回值

  • 声明

    public delegate int MyDelegate(void);
  • 使用

    using System;
    ?
    delegate int CalcInt(int a, int b);
    namespace Delegate
    {
        class TestDelegate
        {
            private int sum = 0;
            
            public static int add(int a, int b){
                sum += a+b;
                return a+b; 
            }
            
            public static int sub(int a,int b){
                sum += a-b;
                return a-b;
            }
            
            public getsum(){
                return sum;
            }
            
            static void main(string[] args)
            {
                CalcInt calcA = new CalcInt(add);
                CalcInt calcB = new CalcInt(sub);
                CalcInt calc = calcA + calcB;
                Console.WriteLine("return:" + calc(8,5));
                Console.WriteLine("sum:" + getsum());
            }
        }
    }

    return:3

    sum:16

这里的delegate的作用仅仅是用于创建一个函数实例,然后供事件触发时运行该“委托”而已。

btn_1.OnClick.AddListener(delegate()
{
    GameObject plane = GameObject.Fine("DrawPlane");
    plane.GetComponent<DrawPlane>().setpicIndex(btn_1Index);
})

最终结果?

?

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-08-30 12:32:08  更:2021-08-30 12:32:16 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/2 9:12:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码