贴图融合(弹痕)

// 功能:

// 挂载对象:

//注意:

using UnityEngine;

using System.Collections.Generic;

public class Blendbullet : MonoBehaviour

{

// 原来的墙壁纹理

public Texture2D m_oldwalltexture;

// 新创建一个墙壁的纹理图片

Texture2D m_newwalltexture;

// 子弹的纹理图片

public Texture2D m_bullettexture;

// 对UV坐标的理解

// UV坐标就是图片在屏幕上像素点的位置 相当于常规的x,y 坐标

//范围是[0,1],左下角是(0,0) 右上角是(1,1),

// U坐标=第U个像素点/相片的宽;

// V坐标=第V个像素点/图片的高;

float m_wallwidth;

float m_wallheight;

float m_bulletwidth;

float m_bulletheight;

float m_timer;

//鼠标点击位置得到的Uv坐标 使用队里存储

Queue UVque = new Queue ();

void Awake ()

{

// 原来的墙壁纹理

m_oldwalltexture = GetComponent ().material.mainTexture as Texture2D;

// 为了以后修改的纹理以后还能还原,我使用一个备份的纹理

m_newwalltexture = Instantiate (m_oldwalltexture);

//现在使用备份的纹理图片,这样就算修改也修改是备份的图片

GetComponent ().material.mainTexture = m_newwalltexture;

// 拿到墙壁和子弹的纹理宽度和高度

m_wallwidth = m_newwalltexture.width;

m_wallheight = m_newwalltexture.height;

m_bulletwidth = m_bullettexture.width;

m_bulletheight = m_bullettexture.height;

}

RaycastHit hit = new RaycastHit ();

void Update ()

{

// 鼠标位置--射线

Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);

if (Input.GetMouseButtonDown (0)) {

if (Physics.Raycast (ray, out hit)) {

if (hit.collider.gameObject.name == "Plane") {

// 拿到鼠标点击位置的uv坐标

Vector2 uv = hit.textureCoord;

// 在此将点击的uv坐标存起来

UVque.Enqueue (uv);

// 实现将子弹的图片纹理和墙壁纹理图片的融合

// 实质:遍历像素点

for (int i = 0; i < m_bulletwidth; i++) {

for (int j = 0; j < m_bulletheight; j++) {

//先拿到鼠标点击的像素点  uv.x * m_bulletwidth

//想要遍历到所有的子弹纹理图片区域的像素点,我们从uv原点开始扫描

// 鼠标点击的是墙,uv*墙的宽和高, 拿到的就是鼠标在墙上的位置的uv坐标

float w = (uv.x * m_wallwidth - m_bulletwidth / 2) + i;

float h = (uv.y * m_wallheight - m_bulletheight / 2) + j;

// 得到子弹中所有的像素

Color bulletPixels = m_bullettexture.GetPixel (i, j);

// 得到墙壁纹理中的子弹纹理大小的所有像素

Color wallpixsls = m_newwalltexture.GetPixel ((int)w, (int)h);

// 开始融合 像素点相乘

m_newwalltexture.SetPixel ((int)w, (int)h, bulletPixels * wallpixsls);

}

}

//确认修改完毕 提交修改

m_newwalltexture.Apply ();

// 弹痕三秒后消失

Invoke ("Reback", 3f);

}

}

}

}

// 让弹痕消失 ,还原墙壁

void Reback ()

{

Vector2 uv = UVque.Dequeue ();

for (int i = 0; i < m_bulletwidth; i++) {

for (int j = 0; j < m_bulletheight; j++) {

float w = (uv.x * m_wallwidth - m_bulletwidth / 2) + i;

float h = (uv.y * m_wallheight - m_bulletheight / 2) + j;

// 注意: 请使用原本的纹理的像素

Color wallpixsls = m_oldwalltexture.GetPixel ((int)w, (int)h);

m_newwalltexture.SetPixel ((int)w, (int)h, wallpixsls);

}

}

// 别忘记提交一下应用

m_newwalltexture.Apply ();

}

}

你可能感兴趣的:(贴图融合(弹痕))