2018-01-16 18:39:55 linian71 阅读数 649

一、场景准备,建立一个简单的场景,一个平板在xz平面,一个红色小圆球代表原点,创建一个半径0.5的小球C位置在(0, 0.5, 0) 

二、创建Shader:

Shader中,将物体的世界坐标作为颜色传给fragment shader, Shader代码如下:

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "Unity Shader Book/Chapter5/SimpleShader" {

	SubShader {
		Pass {
			CGPROGRAM

			#pragma vertex vert
			#pragma fragment frag

			//add _Color
			//uniform fixed4 _Color;
			fixed4 _Color;

			struct a2v {
				float4 vertex : POSITION;
			};

			struct v2f {
				float4 pos : SV_POSITION;
				float3 color : COLOR0;	
			};

			v2f vert(a2v v) {
				v2f o;
				o.pos = UnityObjectToClipPos (v.vertex);
				 //这里除法是比例缩放,将世界坐标变换到合适的范围
				o.color = mul(_Object2World, v.vertex).xyz /1.0;   
				return o;
			}

			float4 frag(v2f i) : SV_Target {

//				float dis = length(i.color);
//				return float4(dis, dis, dis, 1.0);	//输出灰度时使用

				float3 f_color = abs(i.color);
				return float4(f_color, 1.0);
			}

			ENDCG
		}
	}
}
创建一个Material,把Shader绑定到Material;再将Material赋给小球C

三、测试

在编辑界面或者运行界面,沿着小球Local坐标系x, y, z轴拖动小球C,可以看到小球颜色变化。

(由于小球都在xz平面以上,y坐标大于零,初始在(0, 0.5, 0)位置时默认偏绿色,所以后面图片里蓝色、红色都和绿色混合了,说明小球表面上的y坐标值大于0)

小球在世界坐标系下:

沿着+-z轴移动时,变蓝色;


沿着+-x轴移动时,变红色;


沿着+-y轴移动时,变绿色;


2013-07-20 14:59:28 a2587539515 阅读数 3218

账号被盗,文章被修改,博主已将博文删除

2017-07-15 13:59:06 u011480667 阅读数 2826

平面UI跟随场景中的3D物体类似于血条的跟随效果。

经过几种方案的对比发现把3D物体的坐标转化为平面坐标的方案是最行之有效的方法。

下面直接上代码

public class FollwScript : MonoBehaviour
{
public Transform gob3d;//3d物体
public RectTransform imageRec;//2dUI
public Vector3 offset;//两个物体间的偏移量


void Update ()
{
follow();
}
    void follow(){
Vector3 screenPos = Camera.main.WorldToScreenPoint (gob3d.position);
imageRec.position = screenPos+offset;
}
}

2016-10-15 22:06:13 alistair_chow 阅读数 1131

效果图:


思路:

1. 首先获取3D物体在屏幕上的坐标点

2. 将2D图像放置于该坐标点的上方

3. 判断物体在屏幕上的坐标是否改变,若改变则更新2D图像位置

代码

<pre name="code" class="csharp">public class UIImageOnObject : MonoBehaviour {
    public Camera m_Camera;
    public GameObject m_Target;
    public float m_Offset = 90f;
    public bool m_IsActive;
    private Vector3 m_Pos;
    private Vector3 m_CurPos;
    private Tweener m_Tween;

	// Update is called once per frame
	void Update () {
        if (m_IsActive)
        {
            m_CurPos = m_Camera.WorldToScreenPoint(m_Target.transform.position);
            //若目标物体在屏幕上的坐标改变,则更新位置及动画
            if(m_Pos != m_CurPos)
            {
                m_Pos = m_CurPos;
                transform.position = new Vector3(m_CurPos.x, m_CurPos.y + m_Offset, m_Pos.z);
                m_Tween.Kill();
                m_Tween = transform.DOMoveY(m_CurPos.y + m_Offset - 10f, 0.8f).SetLoops(-1);
            }
        }
    }

    public void SetActive(bool active)
    {
        m_IsActive = active;
        if (active)
        {
            //获取目标物体在屏幕上的坐标
            m_Pos = m_Camera.WorldToScreenPoint(m_Target.transform.position);
            m_CurPos = m_Pos;
            //将2D物体置与坐标点的上方
            transform.position = new Vector3(m_CurPos.x, m_CurPos.y + m_Offset, m_CurPos.z);
            //动画,2D物体上下漂浮效果
            m_Tween = transform.DOMoveY(m_CurPos.y + m_Offset - 10f, 0.8f).SetLoops(-1);
        }
        if (active == false)
            gameObject.SetActive(false);
    }
}





2019-09-19 09:40:08 qq_34735841 阅读数 288

原本以为只要将鼠标坐标转为世界坐标,然后将转换后的坐标赋给物体就能实现。经多次尝试发现,鼠标转成世界坐标之后缺一Z轴,所以想出的解决方案是先将要跟随的物体的世界坐标转成屏幕坐标,再把该屏幕坐标的Z轴赋给鼠标的Z轴,这样一来,鼠标就具备了Z轴,再将鼠标坐标转为世界坐标,代码如下:

 

 //获取需要移动物体的世界转屏幕坐标
        Vector3 screenPos = Camera.main.WorldToScreenPoint(this.transform.position);
        //获取鼠标位置
        Vector3 mousePos = Input.mousePosition;
        //因为鼠标只有X,Y轴,所以要赋予给鼠标Z轴
        mousePos.z = screenPos.z;
        //把鼠标的屏幕坐标转换成世界坐标
        Vector3 worldPos = Camera.main.ScreenToWorldPoint(mousePos);
        //控制物体移动
        transform.position = worldPos;

 

没有更多推荐了,返回首页