Unity脚本生成图片

Posted 御雪妃舞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity脚本生成图片相关的知识,希望对你有一定的参考价值。

学习shader,刚开始,记下一些自己的解读,如果有其它意见或者建议的欢迎交流。


首先先上脚本生成图片的效果图:





当然还可以根据参数有所改变。


下面开始逐步分析:

1.线性变化,颜色控制在黑白(y=|1-x|,1>=x>=0)

首先,贴下代码:
直接看代码可能不大好理解,下面我们具体化一下:
如上图所示,这个原理就是以图片的中心为原点,图片的高为h,0.5h作为半径的圆的分部,从圆心到圆周的颜色减暗。
我们代码一句一句分析, Vector2 currentposition = new Vector2(x, y)这一句就是遍历的图片大小像素点钟的任意一点。 float pixeldistance = Vector2.Distance(currentposition, centerPixelPosition) / (widthHeight * 0.5f)这一句就是图中表示的Distance/(h*0.5),就是点到圆心的距离除以半径,圆内的点值是0-1,圆外的大于1,假设这个值为x pixeldistance = Mathf.Abs(1 - Mathf.Clamp(pixeldistance, 0f, 1f))这一句,首先clamp是把x的值控制在0-1内,(1-x)是取相反,为啥呢,这里因为颜色表里,0代表黑色,1代表白色,圆心距离圆心距离为0,但是直接给0就是黑色,1-0的话就是白色,这样圆心就是白色,书中代码是由abs绝对值的,我认为没必要,x在0-1,1-x肯定大于等于0的。 下图实例,不是1-x的效果,就是直接用x的效果:就是黑变白了  Color pixelcolor = new Color(pixeldistance, pixeldistance, pixeldistance, 1.0f)这是设置颜色,颜色rgb值一样是都是黑白色,这个具体可以看下图,沿着箭头那条边的rgb的三个值都是一样的,然后看出显然是黑白色: proceduralTexture.SetPixel(x, y, pixelcolor) 设置像素点的颜色。
最终运行效果如图:


2.随sin周期变化,颜色控制在黑白(y=sin(nx)*x)

首先,贴下代码:
这个跟1的代码几乎一样,只有一行不同         pixelDistance = (Mathf.Sin(pixelDistance * 30.0f) * pixelDistance)这个函数出来的效果就是水波纹,函数图如图: 于是颜色就随圆黑白变化,n越大,白色圈越多 一下是几个视图: n=10:
n=30:                  n=100:

3.颜色根据方向向量偏移角度控制

首先,贴上代码:
代码示意图如下:
rgb三个值,对应三个方向的夹角值,这样的话是发散的,中心点出来的同一条线颜色是一样的。
效果图如下:


4.颜色根据方向向量和方向轴的数量积

这个跟3很类似,就是把angle换成了dot,就是上面3的夹角的cos值,颜色会比上面的鲜亮点:

最后:粘上总得脚本,大家可以试试,有个条件编译,改下就好:
#define Case1 //条件编译

using UnityEngine;
using System.Collections;

public class _ProceduralTexture : MonoBehaviour


    public int widthHeight = 512;

    /// <summary>
    /// 生成的图片
    /// </summary>
    public Texture2D generatedTexture;

    /// <summary>
    /// 当前的材质
    /// </summary>
    private Material currentMaterial;

    /// <summary>
    /// 中心坐标
    /// </summary>
    private Vector2 centerPosition;


    // Use this for initialization
    void Start()
    
        if (!currentMaterial)
        
            //共享当前物体的材质
            currentMaterial = transform.GetComponent<Renderer>().sharedMaterial;
            if (!currentMaterial)
            
                Debug.LogWarning("Cannot find a material on:" + transform.name);
            
        

        if (currentMaterial)
        
            centerPosition = new Vector2(0.5f, 0.5f);
            generatedTexture = GenerateParabola();

            //设置当前材质的贴图为我们生成的贴图
            currentMaterial.SetTexture("_MainTex", generatedTexture);
        
    

    /// <summary>
    /// 生成贴图
    /// </summary>
    /// <returns></returns>
    private Texture2D GenerateParabola()
    
        //新建一张贴图
        Texture2D proceduralTexture = new Texture2D(widthHeight, widthHeight);

        //中心像素坐标
        Vector2 centerPixelPosition = centerPosition * widthHeight;

        //遍历像素点设置
        for (int x = 0; x < widthHeight; x++)
        
            for (int y = 0; y < widthHeight; y++)
            
#if Case1
                #region 颜色控制在黑白,线性变化函数是y=|1-x|,1>=x>=0
                Vector2 currentposition = new Vector2(x, y);
                float pixeldistance = Vector2.Distance(currentposition, centerPixelPosition) / (widthHeight * 0.5f);

                pixeldistance = Mathf.Abs(1 - Mathf.Clamp(pixeldistance, 0f, 1f));

                Color pixelcolor = new Color(pixeldistance, pixeldistance, pixeldistance, 1.0f);
                proceduralTexture.SetPixel(x, y, pixelcolor);
                #endregion

#elif Case2
#region 颜色控制在黑白随sin周期变化,变化是(2*π)/n,下面的n是30
                Vector2 currentPosition = new Vector2(x, y);
                float pixelDistance = Vector2.Distance(currentPosition, centerPixelPosition) / (widthHeight * 0.5f);
                pixelDistance = Mathf.Abs(1 - Mathf.Clamp(pixelDistance, 0f, 1f));
                pixelDistance = (Mathf.Sin(pixelDistance*30) * pixelDistance);
                Color pixelColor = new Color(pixelDistance, pixelDistance, pixelDistance, 1.0f);
                proceduralTexture.SetPixel(x, y, pixelColor);
#endregion
#elif Case3
#region 颜色根据方向向量偏移角度控制
                Vector2 currentPosition = new Vector2(x, y);
                Vector2 pixelDirection = centerPixelPosition - currentPosition;
                pixelDirection.Normalize();
                float rightDirection = Vector2.Angle(pixelDirection, Vector3.right) / 360;
                float leftDirection = Vector2.Angle(pixelDirection, Vector3.left) / 360;
                float upDirection = Vector2.Angle(pixelDirection, Vector3.up) / 360;
                Color pixelColor = new Color(rightDirection, leftDirection, upDirection, 1.0f);
                proceduralTexture.SetPixel(x, y, pixelColor);
#endregion
#elif Case4

                #region 颜色根据方向向量和方向轴的数量积
                Vector2 currentPosition = new Vector2(x, y);
                Vector2 pixelDirection = centerPixelPosition - currentPosition;
                pixelDirection.Normalize();
                float rightDirection = Vector2.Dot(pixelDirection, Vector3.right);
                float leftDirection = Vector2.Dot(pixelDirection, Vector3.left);
                float upDirection = Vector2.Dot(pixelDirection, Vector3.up);
                Color pixelColor = new Color(rightDirection, leftDirection, upDirection, 1.0f);
                proceduralTexture.SetPixel(x, y, pixelColor);
                #endregion
#endif


            
        

        proceduralTexture.Apply();

        return proceduralTexture;
    




以上是关于Unity脚本生成图片的主要内容,如果未能解决你的问题,请参考以下文章

Unity工具类扩展——UGUI代码/脚本自动化生成

Unity中用Mesh画一个圆环

用unity做一个游戏商城,通过脚本添加进去图片及相关信息,然后点击商品会弹出购买画面,

Unity-通过脚本修改图片sprite

Unity2D修改Sprite颜色和透明度

关于Unity实现自定义多边形图片效果