2015-11-03 21:13:31 VioletTD 阅读数 2318

   今天向大家介绍一下,如何初步的用Unity3D从摄像机到鼠标的射线,也就是鼠标检测到Unity3D世界中的游戏对象!

       如何才能使射线检测到游戏对象呢,只有一个条件,那就是必须添加collider组件,否则你是绝度检测不到,你想要检测的物体的!

       如果你还是检测不到Unity3D世界里的游戏对象的话! 真相只有一个"你没有在Update里调用该方法"!

       好了,到了代码的部分的,请大家指教,哈哈哈哈哈哈哈!
using UnityEngine;
using System.Collections;
/// <summary>
/// 功能:数遍检测寻找Unity3D世界里的游戏对象
/// 创建者: VioletTD
/// 创建时间:2015年11月3日 21:28
/// 感谢: Me加油!!
/// </summary>
public class RayToFindTest : MonoBehaviour {//射线查找的测试脚本

	void Update () {
		RayToFindMethod ("Player");//
	}
	void RayToFindMethod(string tags)//定义一个私有的,无返回值,有参数的方法  参数为你想找到的游戏对象的标签(Tag)
	{
		Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);//实例化从摄像机到鼠标的摄像
		RaycastHit hit;//这个为射线命中的点
		if (Physics.Raycast (ray,out hit)) {//物理静态类中的光线投射方法 ->  意义:射线投射出  "得到射线命中的点(hit)"
			if (hit.transform.CompareTag(tags)) {//如果射线命中的点的标签(Tag)值为 tags -> 即:外部传入的参数(你想要找到的游戏对象的标签)  并把hit射线命中的点的类型转换为transform类型
				Debug.Log (hit.transform.name);//为真执行输出射线命中点的名字
			}
		}
	}
}

         谢谢大家的支持和鼓励!


2016-07-11 17:57:41 CSDN_xin_L 阅读数 3654

当鼠标移动到按钮上,按钮做出响应动画。比如手游三国杀中的开始游戏,当手指碰撞到开始游戏时,开始游戏按钮变大的动画制作方法。在翻阅相关官方文档后,发现了一个简易的方法。

鼠标响应动画

对于Button添加组件Animator。
在组件Animator中Navigation中选择Automatic后自动产生动画控制器,之后便可以在Unity3d的动画控制器处选择Highlighted。
这里写图片描述
点击录制按钮然后选择在第0帧处,将按钮的Scale由原本的1,1,1改为1.2,1.2,1.2即可。之后停止录制。
这里写图片描述
这里写图片描述
这样设置完成后当你的鼠标碰撞到按钮后,按钮变会自动放大。

2019-12-18 15:18:27 weixin_44390521 阅读数 14

1. 基本原理
从相机发射一条射线到屏幕的鼠标位置,通过射线检测要抓取得物体
2. 类
(1)Camera : 相机组件
(2)Ray : 射线
(3)Physics.Raycast : 射线反射,碰到三维物体,返回True
(4)Input : 输入组件
3.实现代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class capture : MonoBehaviour {

    private static Camera cam;   
    private static Ray ray ;
    private static RaycastHit hit;
    // Use this for initialization
    void Start () {
        //获取相机组件
        cam = gameObject.GetComponent<Camera>();   
    }
	
	// Update is called once per frame
	void Update () {
        // 判断鼠标左键是否按下
        if (Input.GetMouseButton(0))   
        {
            // 创建一条从相机到鼠标点的射线
            ray = cam.ScreenPointToRay(Input.mousePosition);
            // 判断射线是否击中三维物体
            if (Physics.Raycast(ray,out hit))   
            {
                // 将被击中物体的世界坐标转换为屏幕坐标,目的是获取z位置,因为屏幕坐标只有x,y
                Vector3 hit_object_p = cam.WorldToScreenPoint(hit.collider.transform.position);
                //屏幕坐标转为世界坐标
                Vector3 p = cam.ScreenToWorldPoint(new Vector3
                    (Input.mousePosition.x,
                    Input.mousePosition.y,
                    hit_object_p.z)
                );
                //设置抓取物体的新位置
                hit.collider.transform.position = p;             
            }
        }
	}
}
2019-01-28 14:35:11 q764424567 阅读数 2104

一、前言

有时候图标不能很好的说明这个功能的解释,就需要一些说明性文字显示。就比如可以在鼠标移动到UI上面的时候显示文字。
那么如何在UGUI上,鼠标移动上去显示文字说明呢。
大家都知道,当鼠标移动到button按钮上面的时候会出现变化,主要是button这个组件在控制
在这里插入图片描述
既然可以控制颜色,就一定有状态捕捉的枚举
然后就找到了这个
在这里插入图片描述
接下来就是重写Button类了

二、实现效果

在这里插入图片描述

三、实现步骤

1.新建一个button,然后remove掉原来的button组件
在这里插入图片描述
2.新建TestButton.cs脚本,编写脚本

using UnityEngine;
using UnityEngine.UI;

public class TestButton : Button
{
    enum Selection
    {
        Normal,
        Highlighted,
        Pressed,
        Disabled
    }
    Selection selection;

    protected override void DoStateTransition(SelectionState state, bool instant)
    {
        base.DoStateTransition(state, instant);
        switch (state)
        {
        	//四种状态
            case SelectionState.Normal:
                selection = Selection.Normal;
                break;
            case SelectionState.Highlighted:
                selection = Selection.Highlighted;
                break;
            case SelectionState.Pressed:
                selection = Selection.Pressed;
                break;
            case SelectionState.Disabled:
                selection = Selection.Disabled;
                break;
            default:
                break;
        }
    }

    private void OnGUI()
    {
        GUI.skin.box.fontSize = 10;
        switch (selection)
        {
            case Selection.Highlighted:
                GUI.Box(new Rect(Input.mousePosition.x, Screen.height - Input.mousePosition.y, 100, 25), "Highlighted");
                break;
            case Selection.Pressed:
                GUI.Box(new Rect(Input.mousePosition.x, Screen.height - Input.mousePosition.y, 100, 25), "Pressed");
                break;
            default:
                break;
        }
    }
}

3.挂载到button按钮上
在这里插入图片描述

OK了 。

四、使用EventTriggerListener组件

可以直接使用EventTriggerListener 组件 不过会覆盖其它事件
也可以单独使用接口,不会对其它事件造成影响
IPointerEnterHandler 当鼠标进入对象时
IPointerExitHandler 当鼠标退出对象时
IPointerDownHandler 当鼠标点下对象时
IPointerUpHandler 当鼠标抬起时
IPointerClickHandler 当鼠标点击时
IBeginDragHandler 鼠标开始拖动时
IDragHandler 鼠标拖动时
IEndDragHandler 拖动结束时
IScrollHandler 鼠标滚轮时

这些等以后再详细介绍

2019-07-29 15:50:29 yf391005 阅读数 884

LineRenderer线渲染器主要是用于在3D中渲染线段,在这里要注意LineRenderer渲染出的线段的两个端点是3D世界中的点,即它是属于世界坐标(World Space)中的。

这里我设置了一组单选按钮,通过单选按钮控制线条颜色和粗细。为了方便查看线条,我新建了一个Plane作为背景,根据鼠标按下时的位置,来持续绘制线段

以下为主要代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

public class MsPaint : MonoBehaviour
{
    //线条颜色
    private Color paintColor = Color.red;
    //线条粗细
    private float paintSize = 0.1f;

    //用来存储鼠标位置
    private List<Vector3> paintPos = new List<Vector3>();

    private bool isPressed;//鼠标是否长按
    private LineRenderer ren;

    private Vector3 lastPos;
    //线条材质
    public Material material;


    #region 单选框点击事件
    public void OnRedChange(bool isOn)
    {
        if (isOn)
        {
            paintColor = Color.red;
        }
    }
    public void OnGreenChange(bool isOn)
    {
        if (isOn)
        {
            paintColor = Color.green;
        }
    }
    public void OnBlueChange(bool isOn)
    {
        if (isOn)
        {
            paintColor = Color.blue;
        }
    }

    public void OnPaint1(bool isOn)
    {
        if (isOn)
        {
            paintSize = 0.1f;
        }
    }

    public void OnPaint2(bool isOn)
    {
        if (isOn)
        {
            paintSize = 0.2f;
        }
    }
    public void OnPaint4(bool isOn)
    {
        if (isOn)
        {
            paintSize = 0.4f;
        }
    }

    #endregion  


    private void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            if (EventSystem.current.IsPointerOverGameObject())
            {
                //判断是否点击UI
                return;
            }

            //创建一个空物体,给他动态添加LineRenderer组件
            GameObject line = new GameObject();
            line.transform.SetParent(transform);
            ren = line.AddComponent<LineRenderer>();

            ren.material = material;//设置材质
            ren.startColor = paintColor;//设置颜色
            ren.endColor = paintColor;

            ren.startWidth = paintSize;//设置线的宽度
            ren.endWidth = paintSize;

            ren.numCapVertices = 2;//设置端点圆滑度
            ren.numCornerVertices = 2;//设置拐角圆滑度,顶点越多越圆滑

            lastPos = GetMousePosition();//获取鼠标在世界坐标中的位置
            paintPos.Add(lastPos);
            ren.positionCount = paintPos.Count;//设置构成线条的点的数量
            ren.SetPositions(paintPos.ToArray());

            isPressed = true;
        }
        if (isPressed)
        {
            //鼠标长按开始绘制,两点距离大于0.1开始添加点
            if (Vector3.Distance(lastPos, GetMousePosition()) > 0.1f)
            {
                paintPos.Add(GetMousePosition());
                lastPos = GetMousePosition();
            }
            ren.positionCount = paintPos.Count;
            ren.SetPositions(paintPos.ToArray());
        }

        if (Input.GetMouseButtonUp(0))
        {
            isPressed = false;
            paintPos.Clear();
            ren = null;
        }
    }

    /// <summary>
    /// 获取鼠标位置,将屏幕坐标转为世界坐标
    /// </summary>
    /// <returns></returns>
    private Vector3 GetMousePosition()
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;
        bool isCollider = Physics.Raycast(ray, out hit);
        if (isCollider)
        {
            return hit.point - new Vector3(0, 0, 0.01f);//避免遮挡
        }
        return Vector3.zero;
    }


}

 

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