弹孔融合

原理:实现两张图片的融合,即将其中一张图片的的像素点放到另外一张图片上。


这是俩张图片资源,

弹孔融合_第1张图片
弹孔融合_第2张图片

将两张图片的属性改下,具体做法如图

弹孔融合_第3张图片
弹孔融合_第4张图片

创建场景,直接将墙壁图片托放在Plane上即可

创建脚本PlaneScr,在脚本中实现使用鼠标点击墙壁时能够生成相应的弹痕,将脚本挂载在Plane上

using UnityEngine;

using System.Collections.Generic;

public class BulletScript : MonoBehaviour {  

Texture2D m_OldWallTexture;  

Texture2D m_NewWallTexture;

  public Texture2D m_BulletTexture;  

////// 贴图的坐标属于UV的坐标

/// U和V分别表示贴图在显示器上水平方向的坐标和垂直方向的坐标,左下角为(0,0),右上角为(1,1)

/// U和V的取值范围0~1【U的坐标=第U个像素点/贴图的高度,V的坐标=第V个像素/贴图的高度】

/// UV坐标*贴图的高度=贴图的某一个像素点

/////子弹贴图的宽高 

  float m_BulletWidth;    float m_BulletHeight;   

//贴墙壁纸的宽高

  float m_WallWight;    float m_WallHeight;

    ////// 销毁子弹,就要考虑到队列这种结构,因为先生成的子弹先消失

///

Queuem_BulletUVQueue = new Queue(); 

  private void Awake()    {     

  m_OldWallTexture = GetComponent().material.mainTexture as Texture2D;        m_NewWallTexture = Instantiate(m_OldWallTexture);        GetComponent().material.mainTexture = m_NewWallTexture;        m_BulletHeight = m_BulletTexture.height;   

    m_BulletWidth = m_BulletTexture.width;    

  m_WallWight = m_NewWallTexture.width;   

    m_WallHeight = m_NewWallTexture .height;

    }

void Start () {} 

  // Update is called once per frame   

Ray m_Ray; 

  RaycastHit m_Hit;void Update () {  

    if (Input .GetMouseButtonDown (0))        {     

      m_Ray = Camera.main.ScreenPointToRay(Input.mousePosition);      

    if (Physics.Raycast (m_Ray,out m_Hit ))      

    {     

          Debug.DrawLine(Camera.main.transform.position, m_Hit.point,Color .clear );      

        //1,拿到射线射到的点并返回这个点的坐标     

          Vector2 uv= m_Hit.textureCoord;     

          //2,想排队一样将射到的这一点存起来,将来操作的时候就有顺序了  

                        m_BulletUVQueue.Enqueue(uv);      

        //3,遍历替换像素点,融合像素[子弹打到的位置融合成子弹的像素]   

            for (int i = 0; i < m_BulletWidth ; i++)      

        {        

          for (int j = 0; j < m_BulletHeight ; j++)       

            {      

                //根据UV坐标*贴图的高度=贴图的某一个像素点     

                  //可以知道uv.x*m_NewWallTexture .width就是水平方向的像素点                        //因为涉嫌碰撞的到的点在贴图的中心位置,想要从UV左下角开始遍历整个子弹的像素,就要减去宽高的一半              

        float w = uv.x*m_NewWallTexture .width -m_BulletWidth /2+i;                        float h = uv.y*m_NewWallTexture.height  - m_BulletHeight / 2 + j;                        Color wallColor=m_NewWallTexture.GetPixel((int)w, (int)h);                        Color bulletColor = m_BulletTexture.GetPixel(i, j);                        if (w>0&&h>0&&w0 && h > 0 && w < m_WallWight && h < m_WallHeight)

{

m_NewWallTexture.SetPixel((int)w, (int)h, wallColor );

}

//两个像素点相乘就融合了

}

}

//应用一下

m_NewWallTexture.Apply();

}

}

脚本可以直接复制使用

你可能感兴趣的:(弹孔融合)