广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >unity实现绘画功能
  • 831
分享到

unity实现绘画功能

2024-04-02 19:04:59 831人浏览 薄情痞子
摘要

本文实例为大家分享了Unity实现绘画功能的具体代码,供大家参考,具体内容如下 直接先上效果: gif里面有些颜色不一样是gif功能导致的,绘制出来的都是同一个颜色。 原理其实也简

本文实例为大家分享了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();
    }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

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

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

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

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

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

下载Word文档
猜你喜欢
  • unity实现绘画功能
    本文实例为大家分享了unity实现绘画功能的具体代码,供大家参考,具体内容如下 直接先上效果: gif里面有些颜色不一样是gif功能导致的,绘制出来的都是同一个颜色。 原理其实也简...
    99+
    2022-11-12
  • unity如何实现绘画功能
    这篇文章将为大家详细讲解有关unity如何实现绘画功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。本文实例为大家分享了unity实现绘画功能的具体代码,具体内容如下直接先上效果:gif里面有些颜色不一样...
    99+
    2023-06-14
  • Android实现绘画板功能
    目录实现流程:实现步骤:一、预期效果二、设置横竖屏切换三、确定布局四、自定义滑动条五、绘画区域六、MainActivity实现流程:     ...
    99+
    2022-11-12
  • Android如何实现绘画板功能
    这篇文章主要介绍了Android如何实现绘画板功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。实现流程:     &nbs...
    99+
    2023-06-15
  • Android实现绘画板功能的示例分析
    这篇文章主要介绍Android实现绘画板功能的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!实现流程:        一、预期效果&nbs...
    99+
    2023-06-15
  • Unity实现聊天室功能
    本文实例为大家分享了Unity实现聊天室功能的具体代码,供大家参考,具体内容如下 简单聊天室功能,客户端发送消息后,服务器接收到消息后分发到其它客户端上并显示聊天内容 聊天室服务器 ...
    99+
    2022-11-11
  • Unity实现场景加载功能
    unity场景加载分为同步加载和异步加载,供大家参考,具体内容如下 同步加载 loadScene 首先将前置工作做好。 创建一个项目工程,然后创建三个场景 loading00、loa...
    99+
    2022-11-12
  • OpenCv实现绘图功能
    本文实例为大家分享了OpenCv实现绘图功能的具体代码,供大家参考,具体内容如下 绘制一个图像在上面画线: import numpy as np import matplotli...
    99+
    2022-11-12
  • Unity实现OCR文字识别功能
    首先登陆百度开发者中心,搜索文字识别服务: 创建一个应用,获取AppID、APIKey、SecretKey秘钥信息: 下载C# SDK,将AipSdk.dll动态库导入Unit...
    99+
    2022-11-12
  • Unity计时器功能实现示例
    目录Demo展示介绍计时器功能Unity计时器 Demo展示 介绍 游戏中有非常多的计时功能,比如:各种cd,以及需要延时调用的方法; 一般实现有一下几种方式: 1.手动计时 ...
    99+
    2022-11-12
  • Unity如何实现聊天室功能
    这篇文章给大家分享的是有关Unity如何实现聊天室功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。聊天室服务器服务器需要有以下几个步骤确定Socket协议类型(采用TCP协议或者UDP协议)2、绑定服务器的IP...
    99+
    2023-06-08
  • Unity如何实现语音识别功能
    小编给大家分享一下Unity如何实现语音识别功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!现在语音识别已经被广泛的应用到各个领域中,在Unity开发中,语音识...
    99+
    2023-06-15
  • Unity实现毫秒延时回调功能
    简介 在项目的框架中看到了这个延迟回调的函数,一直以为是通过Unity协程实现的,最后看了源码后才发现是自己实现的。也是,如果用了协程成千上百个回调不得卡死。自己实现了一下核心的脚本...
    99+
    2022-11-12
  • unity使用socket实现聊天室功能
    本文实例为大家分享了unity使用socket实现聊天室的具体代码,供大家参考,具体内容如下 unity聊天室服务端实现 using System; using System.C...
    99+
    2022-11-11
  • 详解Unity 实现语音识别功能
    现在语音识别已经被广泛的应用到各个领域中,在Unity开发中,语音识别也非常受欢迎。大部分人都会选择科大讯飞的语音识别功能,但是在一些小的项目中,使用科大讯飞的就有点大材小用了。今天...
    99+
    2022-11-12
  • Unity实现局域网聊天室功能
    基于Unity实现一个简单的局域网聊天室,供大家参考,具体内容如下 学习Unity有一点时间了,之前学的都是做客户端的一些内容,现在开始学习联网。我的这个是在观看了 Siki 的教学...
    99+
    2022-11-12
  • Android实现简单画中画功能
    Android 8.0推出了PictureInPicture(画中画功能),目前只有在8.0以上的系统上支持。对比IOS,IOS的Picture in Picture 模式是苹果公司...
    99+
    2022-11-12
  • Android实现画中画功能(图片)
    简介: Android 8.0(API 级别 26)允许以画中画 (PIP) 模式启动 Activity。画中画是一种特殊类型的多窗口模式,最常用于视频播放。使用该模式,用户可以通过...
    99+
    2022-11-12
  • Unity怎么实现OCR文字识别功能
    今天就跟大家聊聊有关Unity怎么实现OCR文字识别功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。首先登陆百度开发者中心,搜索文字识别服务:创建一个应用,获取AppID、APIK...
    99+
    2023-06-22
  • html5如何实现画板画笔功能
    这篇文章主要介绍了html5如何实现画板画笔功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。   实现画板画笔功能,效果如下:   1...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作