2016-08-26 14:43:06 IOTHua 阅读数 11455

一、简介


  1. 基于Highlighting System插件的鼠标选中物体时,使物体高亮显示。在这个插件的基础上,改动小部分功能,使物体可以高亮显示。
  2. 在网上有很多这鼠标高亮显示的相关资料,要么不符合自己的要求,要么符合的效果不满意。所以基于这个插件,虽然也有些功能不符合本人的需求,不过可以进行少许改动,下次做项目时,在使用到鼠标选中功能时,直接引用这个脚本和插件就OK了。
  3. 该文章仅供学习,记录。不喜勿喷!
    demo效果图:
    选中物体
    实际项目效果图1:
    选中书本模型
    实际项目效果图2:
    选中其他模型

二、准备工作


1、导入Highlighting System插件,或者不导入直接下载本人做好的demo也可以。
2、在摄像机中添加Highlighting Effect脚本,该脚本必须添加否则Game视口如何显示物体的高亮,具体如下:

MouseHighlight脚本是本人自己写的,功能就是选中物体高亮,不选中就取消高亮。
3、在场景中随便拖入几个物体,如Cube等,必须有碰撞器的物体,为什么要加碰撞器那就是射线的相关知识了

4、上述工作做完后,就开始看看主要脚本MouseHighlight.cs了。

三、实现鼠标选中高亮

1、在这个插件用有很多显示高亮的特效,如:SpectrumController.cs、FlashingController.cs等,不过无需使用这么多,只采用一种即可,我采用的是“SpectrumController.cs”这个类来作为高亮显示的特效。其他特效以及其他功能如图:
Highlighting System插件的主要特效脚本和功能脚本
2、创建MouseHighlight.cs类或者随意创建一个类
整个类结构
****2.1 定义一个变量gameCheck,用于存储选中的物体

public GameObject gameCheck;

****2.2在Update()里执行的代码
主要实现思路是当按下鼠标左键时,发射一条射线,当射线照射到物体时,获取到该物体的对象。然后执行SetObjectHighlight(GameObject obj);该方法下面会讲。

void Update () {

        if(Input.GetMouseButtonDown(0)) {
            var ray = Camera.main.ScreenPointToRay(Input.mousePosition);//鼠标的屏幕坐标转化为一条射线
            RaycastHit hit;

            //距离为5
            //if(Physics.Raycast(ray, out hit, 5)) {
            //    var hitObj = hit.collider.gameObject;
            //    Debug.Log(hitObj);
            //}
            //无距离限制
            if(Physics.Raycast(ray, out hit)) {
                var hitObj = hit.collider.gameObject;
                SetObjectHighlight(hitObj);
                Debug.Log(hitObj);
            }
        }
    }

****2.3 设置物体高亮
这个方法很好理解,如果gameCheck这个变量为空,表示没有物体被选中,直接使该物体处于高亮状态;如果gameCheck这个变量与选中的这个变量是一样的,则使选中的这个物体取消高亮显示状态;gameCheck这个变量与选中的物体不一样的话,把gameCheck这个物体取消高亮显示,把选中的物体设置为高亮。(如果是多选的话,后面会给出思路介绍)

/// <summary>
    /// 设置物体高亮
    /// </summary>
    /// <param name="obj"></param>
    public void SetObjectHighlight(GameObject obj)
    {
        if(gameCheck == null) {
            AddComponent(obj);
        }
        else if(gameCheck == obj) {
            RemoveComponent(obj);
        }
        else {
            RemoveComponent(gameCheck);
            AddComponent(obj);
        }
    }

****2.4 取消高亮显示/添加高亮显示
**(1)添加高亮显示
使物体高亮根据这个插件的Demo,只需要为该物体添加SpectrumController.cs类即可使物体高亮(也可添加其他类,具体可看该插件的demo),但是显示高亮之后还不行,因为根据该脚本的代码,他还有闪烁、颜色改变等功能,不过对于我们来说,并没有必要。

/// <summary>
    /// 添加高亮组件
    /// </summary>
    /// <param name="obj"></param>
    public void AddComponent(GameObject obj)
    {
        if(obj.GetComponent<SpectrumController>() == null) {
            obj.AddComponent<SpectrumController>();
        }
        gameCheck = obj;
    }

改动下SpectrumController.cs类中的部分参数,将闪烁(speed)速度设为0,颜色(col)根据自己要求进行自定义改动.
将闪烁速度设为0,颜色根据自己要求进行自定义改动
(2)取消高亮显示
取消高亮显示也很简单,只需要将SpectrumController.cs脚本和HighlightableObject.cs脚本移出掉即可。HighlightableObject.cs脚本是执行SpectrumController.cs脚本时会添加HighlightableObject.cs脚本。该脚本具体功能就是使物体高亮。
//Destroy(obj.GetComponent());功能是移出物体的某个组件

/// <summary>
    /// 移出组件
    /// </summary>
    /// <param name="obj"></param>
    public void RemoveComponent(GameObject obj)
    {
        if(obj.GetComponent<SpectrumController>() != null) {
            Destroy(obj.GetComponent<SpectrumController>());
        }

        if(obj.GetComponent<HighlightableObject>() != null) {
            Destroy(obj.GetComponent<HighlightableObject>());
        }

        gameCheck = null;
    }

demo下载链接

四、扩展思路


1、实现多选
**如果要实现多选功能的话,就不能只定义gameCheck变量了,需要定义一个泛型变量List或者数组,当选中物体时,判断该泛型是否存在此选中的物体对象,如果不存在则执行高亮功能,并且加入到该泛型中。一般多选都是按住Ctrl键+鼠标左键,所以你需要设置一个参数,该参数可能对demo并没有什么影响,但是在真正的项目中就可能会产生影响。
在Edit->Project Settings->Input下
这里写图片描述
将下面选中的这个删除掉,或者不删除但是自己要清楚有这么个东西。这个Positive Button的值为left ctrl表示的是按左Ctrl也可实现鼠标左键功能。
这里写图片描述
2、使用其他选中特效

2014-03-23 22:10:00 ve12345 阅读数 299

前些天接触unity3d,想实现点击屏幕选中物体的功能。后来研究了下,实现原理就是检测从屏幕发出的射线与物体发生碰撞,而这个发生碰撞的物体就是你选中的物体。

void MobilePick()
{
	if (Input.touchCount != 1 )
        return;

    if (Input.GetTouch(0).phase == TouchPhase.Began)
    {
        RaycastHit hit;
        Ray ray = Camera.main.ScreenPointToRay(Input.GetTouch(0).position);

        if (Physics.Raycast(ray, out hit))
        {
            Debug.Log(hit.transform.name);
            //Debug.Log(hit.transform.tag);
        }
    }
}

void MousePick()
{
    if(Input.GetMouseButtonUp(0))
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;

        if (Physics.Raycast(ray, out hit))
        {
            Debug.Log(hit.transform.name);
            //Debug.Log(hit.transform.tag);
        }
    }
}

在unity3d中,选中物体还有一个条件,就是物体能发生碰撞。这个参数就是碰撞器Collider,Collider是发生物理碰撞的基本条件。

所以如果无法选中物体时,要检查是否物体加了碰撞器。

方法如下:

GameObject gameObject = (GameObject)Instantiate(...);

gameObject.name = "game_object";
gameObject.AddComponent<MeshCollider>();


2013-12-27 12:08:09 u012091672 阅读数 8446

NGUI讨论群:333417608

需求

点击怪物头像后,头像高亮。(限制:高亮值只能一样)

方法

复制Unlit - Transparent Colored.shader,进行修改(最后有完整shader


Shader "Unlit/Transparent Colored" 

改为

Shader "Unlit/Transparent Colored (Bright)"

2、

Properties
	{
		_MainTex ("Base (RGB), Alpha (A)", 2D) = "black" {}
	}

改为

Properties
	{
		_MainTex ("Base (RGB), Alpha (A)", 2D) = "black" {}
		_Bright("Brightness", Float) = 2
	}
3、

sampler2D _MainTex;
float4 _MainTex_ST;

改为

sampler2D _MainTex;
float4 _MainTex_ST;
float _Bright;
4、

fixed4 frag (v2f i) : COLOR
{
	fixed4 col = tex2D(_MainTex, i.texcoord) * i.color;
	return col;
}

改为

fixed4 frag (v2f i) : COLOR
{
	fixed4 col = tex2D(_MainTex, i.texcoord) * i.color;
	col.rgb = _Bright * col.rgb;
	return col;
}
5、保存名字为Unlit - Transparent Colored (Bright).shader

创建新的Atlas


复制Atlas和Material,如上图是Wooden Atlas 1(两个分别是Atlas和Material)

将Atlas Wooden Atlas 1的Material指定为Wooden Atlas 1

修改新的Material


增加亮度


修改Brightness即可(注意:修改后窗口可能不能立即显示效果,需要强制刷新对应的Panel)



应用

代码里面,用的时候将对应的sprite的atlas指定为新的atlas即可。


效果


左边为高亮的图标。右边是灰化的。


附完整Shader

高亮

Shader "Unlit/Transparent Colored (Bright)"
{
	Properties
	{
		_MainTex ("Base (RGB), Alpha (A)", 2D) = "black" {}
		_Bright("Brightness", Float) = 2
	}
	
	SubShader
	{
		LOD 100

		Tags
		{
			"Queue" = "Transparent"
			"IgnoreProjector" = "True"
			"RenderType" = "Transparent"
		}
		
		Cull Off
		Lighting Off
		ZWrite Off
		Fog { Mode Off }
		Offset -1, -1
		Blend SrcAlpha OneMinusSrcAlpha

		Pass
		{
			CGPROGRAM
				#pragma vertex vert
				#pragma fragment frag
				
				#include "UnityCG.cginc"
	
				struct appdata_t
				{
					float4 vertex : POSITION;
					float2 texcoord : TEXCOORD0;
					fixed4 color : COLOR;
				};
	
				struct v2f
				{
					float4 vertex : SV_POSITION;
					half2 texcoord : TEXCOORD0;
					fixed4 color : COLOR;
				};
	
				sampler2D _MainTex;
				float4 _MainTex_ST;
				float _Bright;
				
				v2f vert (appdata_t v)
				{
					v2f o;
					o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
					o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
					o.color = v.color;
					return o;
				}
				
				fixed4 frag (v2f i) : COLOR
				{
					fixed4 col = tex2D(_MainTex, i.texcoord) * i.color;
					col.rgb = _Bright * col.rgb;
					return col;
				}
			ENDCG
		}
	}

	SubShader
	{
		LOD 100

		Tags
		{
			"Queue" = "Transparent"
			"IgnoreProjector" = "True"
			"RenderType" = "Transparent"
		}
		
		Pass
		{
			Cull Off
			Lighting Off
			ZWrite Off
			Fog { Mode Off }
			Offset -1, -1
			ColorMask RGB
			AlphaTest Greater .01
			Blend SrcAlpha OneMinusSrcAlpha
			ColorMaterial AmbientAndDiffuse
			
			SetTexture [_MainTex]
			{
				Combine Texture * Primary
			}
		}
	}
}

灰化

Shader "Unlit/Transparent Colored (Gray)"
{
	Properties
	{
		_MainTex ("Base (RGB), Alpha (A)", 2D) = "black" {}
	}
	
	SubShader
	{
		LOD 100

		Tags
		{
			"Queue" = "Transparent"
			"IgnoreProjector" = "True"
			"RenderType" = "Transparent"
		}
		
		Cull Off
		Lighting Off
		ZWrite Off
		Fog { Mode Off }
		Offset -1, -1
		Blend SrcAlpha OneMinusSrcAlpha

		Pass
		{
			CGPROGRAM
				#pragma vertex vert
				#pragma fragment frag
				
				#include "UnityCG.cginc"
	
				struct appdata_t
				{
					float4 vertex : POSITION;
					float2 texcoord : TEXCOORD0;
					fixed4 color : COLOR;
				};
	
				struct v2f
				{
					float4 vertex : SV_POSITION;
					half2 texcoord : TEXCOORD0;
					fixed4 color : COLOR;
				};
	
				sampler2D _MainTex;
				float4 _MainTex_ST;
				
				v2f vert (appdata_t v)
				{
					v2f o;
					o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
					o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
					o.color = v.color;
					return o;
				}
				
				fixed4 frag (v2f i) : COLOR
				{
					fixed4 col = tex2D(_MainTex, i.texcoord) * i.color;
					col.rgb = dot(col.rgb, fixed3(.222,.707,.071));
					return col;
				}
			ENDCG
		}
	}

	SubShader
	{
		LOD 100

		Tags
		{
			"Queue" = "Transparent"
			"IgnoreProjector" = "True"
			"RenderType" = "Transparent"
		}
		
		Pass
		{
			Cull Off
			Lighting Off
			ZWrite Off
			Fog { Mode Off }
			Offset -1, -1
			ColorMask RGB
			AlphaTest Greater .01
			Blend SrcAlpha OneMinusSrcAlpha
			ColorMaterial AmbientAndDiffuse
			
			SetTexture [_MainTex]
			{
				Combine Texture * Primary
			}
		}
	}
}


2014-09-15 10:38:57 yangyisen0713 阅读数 3789

MonoDevelop编辑器常用快捷键如下:

CTRL+K :删除光标所在行的该行后面的代码
CTRL + ALT +C :注释/不注释该行
CTRL+ DOWN :像鼠标滚轮一样向下拖
CTRL + UP:像鼠标滚轮一样向上拖
CTRL + F :查找该脚本
CTRL + SHIFT + F:查找全部脚本
CTRL + H:替换代码
CTRL + SHIFT +W:关掉所有脚本
CTRL+ALT+Space:代码提示



2016-12-22 17:14:27 BuladeMian 阅读数 2439

模型边缘高亮

阅读数 1025

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