返回顶部
首页 > 资讯 > 精选 >unity如何实现绘画功能
  • 562
分享到

unity如何实现绘画功能

2023-06-14 19:06:12 562人浏览 八月长安
摘要

这篇文章将为大家详细讲解有关Unity如何实现绘画功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。本文实例为大家分享了unity实现绘画功能的具体代码,具体内容如下直接先上效果:gif里面有些颜色不一样

这篇文章将为大家详细讲解有关Unity如何实现绘画功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

本文实例为大家分享了unity实现绘画功能的具体代码,具体内容如下

直接先上效果:

unity如何实现绘画功能

gif里面有些颜色不一样是gif功能导致的,绘制出来的都是同一个颜色。
原理其实也简单,通过一些列的坐标转换得到当前绘制的坐标,然后根据画笔的宽度计算像素数量,最后填充像素块颜色。

备注:

纹理必须在导入设置中设置了 Is Readable 标志
Texture2D.SetPixels :设置像素颜色块。
Texture2D.Apply :实际应用任何先前的 SetPixels 更改。

直接上代码吧:

using System;using System.Collections;using System.Collections.Generic;using UnityEngine; public class Draw : MonoBehaviour{    public static Color Pen_Colour = Color.red;    public static int Pen_Width = 3;         public LayerMask Drawing_Layers;         private Sprite drawable_sprite;    private Texture2D drawable_texture;         private Vector2 previous_drag_position;    private Color[] clean_colours_array;    private Collider2D[] rayResult = new Collider2D[2];    private Color32[] cur_colors;         private bool no_drawing_on_current_drag = false;    private bool mouse_was_previously_held_down = false;         void Awake()    {        drawable_sprite = this.GetComponent<SpriteRenderer>().sprite;        drawable_texture = drawable_sprite.texture;         clean_colours_array = new Color[(int)drawable_sprite.rect.width * (int)drawable_sprite.rect.height];        clean_colours_array = drawable_texture.GetPixels();    }         void Update()    {        bool mouse_held_down = Input.GetMouseButton(0);        if (mouse_held_down && !no_drawing_on_current_drag)        {            Vector2 mouse_world_position = Camera.main.ScreenToWorldPoint(Input.mousePosition);             Collider2D hit = Physics2D.OverlapPoint(mouse_world_position, Drawing_Layers.value);            if (hit != null && hit.transfORM != null)            {                PenBrush(mouse_world_position);                //current_brush(mouse_world_position);            }            else            {                previous_drag_position = Vector2.zero;                if (!mouse_was_previously_held_down)                {                    no_drawing_on_current_drag = true;                }            }        }        else if (!mouse_held_down)        {            previous_drag_position = Vector2.zero;            no_drawing_on_current_drag = false;        }        mouse_was_previously_held_down = mouse_held_down;    }         protected void OnDestroy()    {        Resetcanvas();    }         /// <summary>    ///  重置画布    /// </summary>    private void ResetCanvas()    {        drawable_texture.SetPixels(clean_colours_array);        drawable_texture.Apply();    }         /// <summary>    ///  笔刷    /// </summary>    public void PenBrush(Vector2 world_point)    {        Vector2 pixel_pos = WorldToPixelCoordinates(world_point);                 cur_colors = drawable_texture.GetPixels32();                 if (previous_drag_position == Vector2.zero)        {            MarkPixelsToColour(pixel_pos, Pen_Width, Pen_Colour);        }        else        {            ColourBetween(previous_drag_position, pixel_pos, Pen_Width, Pen_Colour);        }        ApplyMarkedPixelChanges();                previous_drag_position = pixel_pos;    }         private Vector2 WorldToPixelCoordinates(Vector2 world_position)    {        Vector3 local_pos = transform.InverseTransformPoint(world_position);         float pixelWidth = drawable_sprite.rect.width;        float pixelHeight = drawable_sprite.rect.height;        float unitsToPixels = pixelWidth / drawable_sprite.bounds.size.x * transform.localScale.x;         float centered_x = local_pos.x * unitsToPixels + pixelWidth / 2;        float centered_y = local_pos.y * unitsToPixels + pixelHeight / 2;         Vector2 pixel_pos = new Vector2(Mathf.RoundToInt(centered_x), Mathf.RoundToInt(centered_y));         return pixel_pos;    }         private void ColourBetween(Vector2 start_point, Vector2 end_point, int width, Color color)    {        float distance = Vector2.Distance(start_point, end_point);        Vector2 direction = (start_point - end_point).normalized;         Vector2 cur_position = start_point;        float lerp_steps = 1 / distance;         for (float lerp = 0; lerp <= 1; lerp += lerp_steps)        {            cur_position = Vector2.Lerp(start_point, end_point, lerp);            MarkPixelsToColour(cur_position, width, color);        }    }         private void MarkPixelsToColour(Vector2 center_pixel, int pen_thickness, Color color_of_pen)    {        int center_x = (int)center_pixel.x;        int center_y = (int)center_pixel.y;        for (int x = center_x - pen_thickness; x <= center_x + pen_thickness; x++)        {            if (x >= (int)drawable_sprite.rect.width || x < 0)                continue;             for (int y = center_y - pen_thickness; y <= center_y + pen_thickness; y++)            {                MarkPixelToChange(x, y, color_of_pen);            }        }    }    private void MarkPixelToChange(int x, int y, Color color)    {        int array_pos = y * (int)drawable_sprite.rect.width + x;         if (array_pos > cur_colors.Length || array_pos < 0)            return;         cur_colors[array_pos] = color;    }         private void ApplyMarkedPixelChanges()    {        drawable_texture.SetPixels32(cur_colors);        drawable_texture.Apply();    }}

关于“unity如何实现绘画功能”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: unity如何实现绘画功能

本文链接: https://lsjlt.com/news/274519.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • unity如何实现绘画功能
    这篇文章将为大家详细讲解有关unity如何实现绘画功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。本文实例为大家分享了unity实现绘画功能的具体代码,具体内容如下直接先上效果:gif里面有些颜色不一样...
    99+
    2023-06-14
  • unity实现绘画功能
    本文实例为大家分享了unity实现绘画功能的具体代码,供大家参考,具体内容如下 直接先上效果: gif里面有些颜色不一样是gif功能导致的,绘制出来的都是同一个颜色。 原理其实也简...
    99+
    2024-04-02
  • Android如何实现绘画板功能
    这篇文章主要介绍了Android如何实现绘画板功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。实现流程:     &nbs...
    99+
    2023-06-15
  • Android实现绘画板功能
    目录实现流程:实现步骤:一、预期效果二、设置横竖屏切换三、确定布局四、自定义滑动条五、绘画区域六、MainActivity实现流程:     ...
    99+
    2024-04-02
  • Unity如何实现聊天室功能
    这篇文章给大家分享的是有关Unity如何实现聊天室功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。聊天室服务器服务器需要有以下几个步骤确定Socket协议类型(采用TCP协议或者UDP协议)2、绑定服务器的IP...
    99+
    2023-06-08
  • html5如何实现画板画笔功能
    这篇文章主要介绍了html5如何实现画板画笔功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。   实现画板画笔功能,效果如下:   1...
    99+
    2024-04-02
  • Unity如何实现语音识别功能
    小编给大家分享一下Unity如何实现语音识别功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!现在语音识别已经被广泛的应用到各个领域中,在Unity开发中,语音识...
    99+
    2023-06-15
  • php如何实现绘图功能
    本文小编为大家详细介绍“php如何实现绘图功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“php如何实现绘图功能”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。PHP绘图可以使用GD扩展或ImageMagick...
    99+
    2023-07-05
  • C#如何实现Listbox自绘功能
    小编给大家分享一下C#如何实现Listbox自绘功能,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!使用控件的DrawMode属性来实现控件的自绘,首先将C# Listbox的DrawMode设置为OwnerDrawVari...
    99+
    2023-06-17
  • Android实现绘画板功能的示例分析
    这篇文章主要介绍Android实现绘画板功能的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!实现流程:        一、预期效果&nbs...
    99+
    2023-06-15
  • Java如何实现画图板功能
    Java可以使用JavaFX或Swing来实现画图板功能。下面是一个简单的示例代码,演示如何使用JavaFX实现一个简单的画图板:`...
    99+
    2023-08-18
    Java
  • Unity实现聊天室功能
    本文实例为大家分享了Unity实现聊天室功能的具体代码,供大家参考,具体内容如下 简单聊天室功能,客户端发送消息后,服务器接收到消息后分发到其它客户端上并显示聊天内容 聊天室服务器 ...
    99+
    2024-04-02
  • Unity实现场景加载功能
    unity场景加载分为同步加载和异步加载,供大家参考,具体内容如下 同步加载 loadScene 首先将前置工作做好。 创建一个项目工程,然后创建三个场景 loading00、loa...
    99+
    2024-04-02
  • canvas绘图中如何实现撤销功能
    这篇文章给大家分享的是有关canvas绘图中如何实现撤销功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。最近在做网页版图片处理相关的项目,也算是初入了 canvas 的坑。项目需求中有一个给图片添加水印的功能。...
    99+
    2023-06-09
  • OpenCv实现绘图功能
    本文实例为大家分享了OpenCv实现绘图功能的具体代码,供大家参考,具体内容如下 绘制一个图像在上面画线: import numpy as np import matplotli...
    99+
    2024-04-02
  • Android实现简单画中画功能
    Android 8.0推出了PictureInPicture(画中画功能),目前只有在8.0以上的系统上支持。对比IOS,IOS的Picture in Picture 模式是苹果公司...
    99+
    2024-04-02
  • Android实现画中画功能(图片)
    简介: Android 8.0(API 级别 26)允许以画中画 (PIP) 模式启动 Activity。画中画是一种特殊类型的多窗口模式,最常用于视频播放。使用该模式,用户可以通过...
    99+
    2024-04-02
  • Unity计时器功能实现示例
    目录Demo展示介绍计时器功能Unity计时器 Demo展示 介绍 游戏中有非常多的计时功能,比如:各种cd,以及需要延时调用的方法; 一般实现有一下几种方式: 1.手动计时 ...
    99+
    2024-04-02
  • Unity实现OCR文字识别功能
    首先登陆百度开发者中心,搜索文字识别服务: 创建一个应用,获取AppID、APIKey、SecretKey秘钥信息: 下载C# SDK,将AipSdk.dll动态库导入Unit...
    99+
    2024-04-02
  • Vue Echarts如何实现多功能图表绘制
    这篇文章主要介绍“Vue Echarts如何实现多功能图表绘制”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue Echarts如何实现多功能图表绘制”文章能帮助大家解决问题。...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作