根据上一节的内容,创建了一个方块
现在我们来移动该方块
原理其实也很简单,只需要将方块的中心点位置等于鼠标位置即可
Shader代码如下:
Shader "Unlit/shader6"
{
///鼠标移动正方形
Properties
{
_MouseCenter("MouseCenter",Vector)=(0,0,0,0)
_RectColor("RectColor",Color)=(1,1,1,1)
}
SubShader
{
Tags {
"RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct v2f{
float4 vertex:SV_POSITION;
float4 position:TEXCOORD1;
float2 uv:TEXCOORD;
};
v2f vert(appdata_base v){
v2f o;
o.vertex=UnityObjectToClipPos(v.vertex);
o.position=v.vertex;
o.uv=v.texcoord;
return o;
}
//中心点
float4 _MouseCenter;
//颜色
fixed4 _RectColor;
//绘制正方形
float rect(float2 pt,float2 size,float2 center){
float2 p=pt-center;
float2 halfsize=size*0.5;
float hotz=step(-halfsize.x,p.x)-step(halfsize.x,p.x);
float vert=step(-halfsize.y,p.y)-step(halfsize.y,p.y);
return hotz*vert;
}
fixed4 frag (v2f i) : SV_Target
{
float2 pos=i.uv;
float2 size=0.2;
float inRect=rect(pos,size,_MouseCenter);
fixed3 col=fixed3(1,1,0)*inRect;
return fixed4(col,1.0);
}
ENDCG
}
}
}
然后只需要控制_MouseCenter这个参数,通过unity脚本对_MouseCenter进行赋值
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MouseSquare : MonoBehaviour
{
public Material mat;
Vector4 mouse;
Camera cam;
void Start()
{
MeshRenderer rend = GetComponent<MeshRenderer>();
mat = rend.material;
mouse = new Vector4();
mouse.z = Screen.height;
mouse.w = Screen.width;
cam = Camera.main;
}
// Update is called once per frame
void Update()
{
RaycastHit hit;
Ray ray = cam.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray,out hit))
{
mouse.x = hit.textureCoord.x;
mouse.y = hit.textureCoord.y;
// Debug.Log(hit.textureCoord);
Debug.DrawLine(cam.transform.position, hit.point, Color.red);
}
mat.SetVector("_MouseCenter", mouse);
}
}
脚本拖在物体上即可