// 功能:
// 挂载对象:
//注意:
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 ();
}
}