博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Unity】图片融合
阅读量:4089 次
发布时间:2019-05-25

本文共 2579 字,大约阅读时间需要 8 分钟。

using UnityEngine;using System.Collections;using System.Collections.Generic;/// /// 脚本挂载到墙上/// public class ImageFusion : MonoBehaviour {	public Texture2D bulletTexture;		// 【图片】弹痕 	private Texture2D wallTexture;		// 【图片】墙	private Texture2D NewWallTexture;	// 【图片】墙的备份	private float wall_height;		// 【获取墙和弹痕图片的宽高信息】 	private float wall_width;	private float bullet_height;	private float bullet_width;	RaycastHit hit;			        // 获取子弹打击点	private Queue
uiQueues; // 存储像素点信息 // Use this for initialization void Start () { uiQueues = new Queue
(); wallTexture = GetComponent
().material.mainTexture as Texture2D; // 【备份墙的图片】 NewWallTexture = Instantiate (wallTexture); GetComponent
().material.mainTexture = NewWallTexture; wall_height = wallTexture.height; wall_width = wallTexture.width; bullet_height = bulletTexture.height; bullet_width = bulletTexture.width; Debug.Log (wall_width); Debug.Log (bullet_width); } // Update is called once per frame void Update () { if (Input.GetMouseButtonDown(0)) { Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition); if (Physics.Raycast(ray,out hit)) { if (hit.collider.name == "Plane") { // 得到打击点的图片UV坐标 // UV坐标是当前图片宽高的百分比【左下角(0,0),右上角(1,1)】 Vector2 uv = hit.textureCoord; uiQueues.Enqueue (uv); for (int i = 0; i < bullet_width; i++) { for (int j = 0; j < bullet_height; j++) { // 先减去弹痕宽度的一半得到最左边的坐标,依次向右递增 float w = uv.x * wall_width - bullet_width / 2 + i; // 同理,从下到上递增 float h = uv.y * wall_height - bullet_height / 2 + j; Color wallColor = NewWallTexture.GetPixel ((int)w, (int)h); Color bulletColor = bulletTexture.GetPixel (i, j); // 修改弹痕位置的像素为两图的融合颜色,若不相乘融合会使用弹痕原图 NewWallTexture.SetPixel ((int)w, (int)h, wallColor * bulletColor); } } // 应用图片 NewWallTexture.Apply (); Invoke ("ReturnWall", 3f); } } } } void ReturnWall() { // 还原以打击点为原点的图片像素点 Vector2 uv = uiQueues.Dequeue (); for (int i = 0; i < bullet_width; i++) { for (int j = 0; j < bullet_height; j++) { float w = uv.x * wall_width - bullet_width / 2 + i; float h = uv.y * wall_height - bullet_height / 2 + j; // 使用原图的像素进行还原 Color wallColor = wallTexture.GetPixel ((int)w,(int)h); NewWallTexture.SetPixel ((int)w, (int)h, wallColor); } } NewWallTexture.Apply (); }}

图片下载地址:https://pan.baidu.com/s/1gfLZwNx

①需要设置这两张图片的TextureType为Advanced;

②这两张图片都要勾选上Read/WriteEnable属性,允许图片进行像素编辑;

③设置弹痕图片的MaxSize为64,Format格式为:RGBA32 bit;

④设置wall图片的MaxSize为2048,Format格式为RGBA32 bit;

转载地址:http://wbkii.baihongyu.com/

你可能感兴趣的文章
C#实现邮件发送的功能
查看>>
JavaScript可否多线程? 深入理解JavaScript定时机制
查看>>
Axis1.4 调用 Asp.Net 服务简单示例
查看>>
linux 常用指令
查看>>
关于struts2拦截器获取页面参数
查看>>
Linux 下压缩与解压.zip和.rar及.7z文件
查看>>
读书的方法
查看>>
svn断开链接后,重新share提交代码报错
查看>>
PHP基础回顾
查看>>
一颗跳动的心(css3)
查看>>
牛客网 牛可乐发红包脱单ACM赛 B题 小a的旅行计划
查看>>
sqlalchemy--group_concat的使用
查看>>
Git flow 工作流与规范
查看>>
【Mood-3】心声
查看>>
企业IT管理说:全自动就一定是最好的吗?
查看>>
安装mod_rpaf让apache获取访客真实IP
查看>>
MongoDB学习笔记——文档操作之增删改
查看>>
Python 3 利用 Dlib 实现人脸检测和剪切
查看>>
Parametrilayze based on SRL16 shift register FIFO
查看>>
USB枚举 Windows : How does USB stack enumerate a device?
查看>>