iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >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://www.lsjlt.com/news/274519.html(转载时请注明来源链接)

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL怎么更新字段长度
    要更新MySQL表中的字段长度,可以使用ALTER TABLE语句。以下是更新字段长度的示例: ALTER TABLE table_...
    99+
    2024-05-14
    mysql
  • sql如何修改表字段长度
    要修改表字段的长度,可以使用ALTER TABLE语句,然后使用MODIFY COLUMN来修改字段的长度。以下是一个示例: ALT...
    99+
    2024-05-14
    sql
  • mysql数据量太大如何解决
    有几种方法可以解决MySQL数据量过大的问题: 数据库分区:将数据库表按照某种规则进行分区,分成多个小表,可以提高查询速度和管理...
    99+
    2024-05-14
    mysql
  • MySQL单表数据量过大如何解决
    在MySQL中,当单表的数据量过大时,可以采取以下几种方法来解决问题: 使用索引:在表的字段上创建适当的索引,可以提高查询效率,...
    99+
    2024-05-14
    mysql
  • mysql导出数据量过大如何解决
    当导出的数据量过大时,可以尝试以下方法来解决问题: 使用数据库工具:使用数据库管理工具如Navicat或MySQL Workbe...
    99+
    2024-05-14
    mysql
  • mysql中log_bin的作用是什么
    在MySQL中,log_bin是二进制日志文件的名称,用于记录所有对数据库进行更改的操作,如插入、更新、删除等。这些二进制日志文件可...
    99+
    2024-05-14
    mysql
  • mysql中log_bin的特点有哪些
    log_bin是MySQL的二进制日志文件,用于记录所有对数据库的修改操作,包括插入、更新、删除等。 log_bin文件是M...
    99+
    2024-05-14
    mysql
  • mysql rpm包安装的方法是什么
    要在Linux系统上安装MySQL RPM包,可以按照以下步骤操作: 下载MySQL的RPM包:你可以从MySQL官方网站下载适...
    99+
    2024-05-14
    mysql
  • mysql rpm包安装后怎么使用
    安装MySQL RPM包后,您可以通过以下步骤来使用MySQL: 启动MySQL服务:使用以下命令来启动MySQL服务: sud...
    99+
    2024-05-14
    mysql
  • lxml中怎么处理XML命名空间默认值
    在lxml中处理XML命名空间的默认值可以通过使用xpath()方法和register_namespace()方法来实现。...
    99+
    2024-05-14
    lxml
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作