最近有一份需求,就是让策划任意选择可一片区域,表明是有某种用途的。埋头写了两头,试了三四种方法,最终不得已用小方格来代替,并最终构建mesh保存下来,这样做程序的就很方便用了。我们的目标就是没有蛀牙oh,应该是累死别人,轻松自己!!!
1,简单shader编写
首先应该搞一个简单的Shader来显示我们的所编辑的内容
Shader "Custom/BlockShader" {
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
_Size ("Size",Vector) = (64,32,0,0) //在面板上显示长多少格,宽多少格
_Color ("Color", Color) = (0,0,0,0.5)
_RimColor ("Rim Color", Color) = (1,1,0,1)
_RimPower ("Rim Power", Range(0,0.2)) = 0.01
_HitPoint ("Hit Point",Vector) = (0.0,1,0.0,0.5)//鼠标点击点
_SelectColor ("Select Color",Color) = (0,1,0,1)//选中颜色
_HitColor ("Already hit Color", Color) = (0.2,0.8,0.9,0.5)
}
SubShader {
Tags { "Queue"="Transparent" }
CGPROGRAM
#pragma surface surf Lambert alpha
#pragma target 3.0
sampler2D _MainTex;
half4 _Size;
fixed4 _Color;
fixed4 _RimColor;
float _RimPower;
float4 _HitPoint;
fixed4 _SelectColor;
fixed4 _HitColor;
struct Input {
float2 uv_MainTex;
};
void surf (Input IN, inout SurfaceOutput o) {
float2 uv = IN.uv_MainTex;
fixed4 c = _Color;
float radiox = 1.0 / (_Size.x * 2);//每格大小的一半
float radioy = 1.0 / (_Size.y * 2);
float nx = floor(uv.x/(radiox * 2)) * radiox * 2 + radiox;//找到格的中心点
float ny = floor(uv.y/(radioy * 2)) * radioy * 2 + radioy;
fixed4 tc = tex2D (_MainTex, float2(nx,ny) );
if(tc.g > 0.85) //因为选中我设置为了绿色(0,1,0,1)
{
c = _HitColor;
//if(uv.x >= nx-radiox && uv.x <nx+ radiox && uv.y >= ny-radioy && uv.y <= ny+radioy)
//{
// c = _HitColor;
//}
}
if(uv.x >= _HitPoint.x-radiox && uv.x <_HitPoint.x+ radiox && uv.y >= _HitPoint.y-radioy && uv.y <= _HitPoint.y+radioy)
{
c = _SelectColor;//选中颜色
}
if(fmod(uv.x ,(radiox * 2)) < (radiox * 2) * _RimPower)//边框
{
c = _RimColor;
}
if(fmod(uv.y ,(radioy * 2)) < (radioy * 2) * _RimPower)
{
c = _RimColor;
}
o.Albedo = c.rgb;
o.Alpha = 0.5;
}
ENDCG
}
FallBack "Diffuse"
}
我知道,以上写的很粗糙。。。但是,谁让我是pc上用的呢,谁还管效率是毛线
下一步,需要每套的脚本控制
2,脚本控制
主要是为了运行时,通过点击生成方格
using System.Collections.Generic;
using UnityEngine;
/**
*
* 用于编辑器美术使用脚本,功能为画地形方块
*
*/
public class TerrianBlockControl : MonoBehaviour
{
public int width;
public int height;
public Texture2D text