2016-06-03 15:58:27 FenYinFu 阅读数 2976
  • Unity3DUI系统(UGUI)初级入门

    本课程主要介绍Unity3d的UI系统(UGUI),先对UGUI做一个总体概述,之后对每个UI控件逐一进行详细讲述,内容包括控件的作用、设置方法、使用场景及属性细节,帮助大家熟练使用UGUI设计游戏的交互界面。

    977 人正在学习 去看看 伍晓波
using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;

public class Tool : MonoBehaviour, IDragHandler,IPointerDownHandler,IPointerUpHandler{

	// Use this for initialization
	void Start () {
	}

	// Update is called once per frame
	void Update () {
	}

	public void OnPointerDown(PointerEventData eventDate) {
		Debug.Log ("start");
	}

	public void OnDrag (PointerEventData eventData) {
        GameObject pointerDrag = eventData.pointerDrag;

		Vector3 globalMousePosition;
        if (RectTransformUtility.ScreenPointToWorldPointInRectangle(pointerDrag.GetComponent<RectTransform>(), eventData.position, Camera.main, out globalMousePosition))
        {
            pointerDrag.transform.position = globalMousePosition;
		} 
	}

	public void OnPointerUp(PointerEventData eventData) {
		Debug.Log ("end");
	}
}

2019-03-22 12:05:29 u010737459 阅读数 360
  • Unity3DUI系统(UGUI)初级入门

    本课程主要介绍Unity3d的UI系统(UGUI),先对UGUI做一个总体概述,之后对每个UI控件逐一进行详细讲述,内容包括控件的作用、设置方法、使用场景及属性细节,帮助大家熟练使用UGUI设计游戏的交互界面。

    977 人正在学习 去看看 伍晓波

Unity 拖动UI物体(超级干货)

首先我们先创建一个C#脚本 名字就叫MyMove
代码如下

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

public class MyMove: MonoBehaviour
{

    public  GameObject Canvas;
    GameObject InputObject;
    bool b;//鼠标是否在按下状态
    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
    	//当鼠标按下时 状态为按下状态 InputObject去获取鼠标点击的UI
        if (Input.GetMouseButtonDown(0))
        {
            b = true;
            InputObject = GetOverUI(Canvas);       
        }
		//当鼠标抬起时 状态为抬起状态 InputObject等于null
        if (Input.GetMouseButtonUp(0))
        {
            b = false;
            InputObject = null;
        }
		
		
        if (InputObject != null && b==true)
        {
            if (InputObject.name == "Over")
            {
                InputObject.transform.position = new Vector3(Input.mousePosition.x, Input.mousePosition.y, 0);
            }
        }
    }


    /// <summary>
    /// 获取鼠标停留处UI
    /// </summary>
    /// <param name="canvas"></param>
    /// <returns></returns>
    public GameObject GetOverUI(GameObject canvas)
    {
        PointerEventData pointerEventData = new PointerEventData(EventSystem.current);
        pointerEventData.position = Input.mousePosition;
        GraphicRaycaster gr = canvas.GetComponent<GraphicRaycaster>();
        List<RaycastResult> results = new List<RaycastResult>();
        gr.Raycast(pointerEventData, results);
        if (results.Count != 0)
        {
            return results[0].gameObject;
        }

        return null;
    }



    /// <summary>
    /// 获取鼠标停留处物体,不仅适合UI还适合3D物体
    /// </summary>
    /// <param name="raycaster"></param>
    /// <returns></returns>
    public GameObject GetOverGameObject(GameObject raycaster)
    {
        PointerEventData pointerEventData = new PointerEventData(EventSystem.current);
        pointerEventData.position = Input.mousePosition;
        PhysicsRaycaster pr = raycaster.GetComponent<PhysicsRaycaster>();
        List<RaycastResult> results = new List<RaycastResult>();
        pr.Raycast(pointerEventData, results);
        if (results.Count != 0)
        {
            return results[0].gameObject;
        }

        return null;
    }
}

然后将上面的C#脚本挂载到我们的 Canvas 上面 (我这边的名字跟上面代码的名字不同,代码是一样的)
在这里插入图片描述
然后将我们的Canvas 拖到我们这边来 (我这边的名字跟上面代码的名字不同,代码是一样的)在这里插入图片描述

然后我们在创建一个 image 取名叫Over 我再随便给他设置个颜色 将其挂载到 Canvas 节点下。
在这里插入图片描述
然后运行
在这里插入图片描述

在这里插入图片描述
哈哈完成 ,想拖到哪里就拖到哪里 。

在这里插入图片描述

2019-08-14 13:35:37 jianlun3009 阅读数 145
  • Unity3DUI系统(UGUI)初级入门

    本课程主要介绍Unity3d的UI系统(UGUI),先对UGUI做一个总体概述,之后对每个UI控件逐一进行详细讲述,内容包括控件的作用、设置方法、使用场景及属性细节,帮助大家熟练使用UGUI设计游戏的交互界面。

    977 人正在学习 去看看 伍晓波
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

public class MYTEST : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
    public bool IsDrag;
    public Transform OtherBox;
    public Transform SelfBox;
    public Vector2 OriginPos;
    public GameObject ResCube;

    public int TerrainLayMask;

    private GameObject _createGo;


    void Awake()
    {
        OriginPos = transform.GetComponent<RectTransform>().anchoredPosition;
        TerrainLayMask = LayerMask.GetMask("Terrain");
    }
    private void Update()
    {
        if (!IsDrag) return;
        InOrOutUI(Input.mousePosition.x > 100);
        if (_createGo == null) return;
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//摄像机到屏幕的射线
        RaycastHit hit;
        Vector3 newPos;
        if (Physics.Raycast(ray, out hit,1000, 1 << LayerMask.NameToLayer("Terrain")))//如果碰到Collider,就把物体的位置变成这个位置
        {
            newPos = hit.point;
            Debug.Log("碰到Collider>>>"+ newPos);
        }
        else//如果没有碰到,就把屏幕坐标转换为世界坐标
        {
            var pos = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, Camera.main.nearClipPlane + 300f));
            newPos = pos;
            Debug.LogError("NO碰到>>>>>"+ newPos);
        }
//        _createGo.transform.position = newPos;
        _createGo.transform.position = new Vector3(newPos.x, newPos.y+25, newPos.z);
    }

    void InOrOutUI(bool b)
    {
        if (b)
        {
            if (transform.parent == OtherBox) return;
            transform.SetParent(OtherBox);
            if (_createGo == null)
            {
                _createGo = Instantiate<GameObject>(ResCube);
            }
            else
            {
                _createGo.SetActive(true);
            }
        }
        else
        {
            if (transform.parent == SelfBox) return;
            transform.SetParent(SelfBox);
            transform.localScale = Vector3.one;
            if (_createGo != null)
            {
                _createGo.SetActive(false);
            }
        }
    }

    // begin dragging
    public void OnBeginDrag(PointerEventData eventData)
    {
        IsDrag = true;
        Debug.Log("OnBeginDrag");
        SetDraggedPosition(eventData);
    }

    // during dragging
    public void OnDrag(PointerEventData eventData)
    {
        SetDraggedPosition(eventData);
    }

    // end dragging
    public void OnEndDrag(PointerEventData eventData)
    {
        IsDrag = false;
        Debug.Log("OnEndDrag");
        SetDraggedPosition(eventData);
        transform.GetComponent<RectTransform>().anchoredPosition = OriginPos;
    }

    /// <summary>
    /// set position of the dragged game object
    /// </summary>
    /// <param name="eventData"></param>
    private void SetDraggedPosition(PointerEventData eventData)
    {
        var rt = gameObject.GetComponent<RectTransform>();

        // transform the screen point to world point int rectangle
        Vector3 globalMousePos;
        if (RectTransformUtility.ScreenPointToWorldPointInRectangle(rt, eventData.position, eventData.pressEventCamera,
            out globalMousePos))
        {
            rt.position = globalMousePos;
        }

    }
}

 

2015-08-19 19:56:25 u013291337 阅读数 875
  • Unity3DUI系统(UGUI)初级入门

    本课程主要介绍Unity3d的UI系统(UGUI),先对UGUI做一个总体概述,之后对每个UI控件逐一进行详细讲述,内容包括控件的作用、设置方法、使用场景及属性细节,帮助大家熟练使用UGUI设计游戏的交互界面。

    977 人正在学习 去看看 伍晓波

脚本附着在物体上,加上collide,非mesh collider

</pre><pre name="code" class="csharp">using UnityEngine;
using System.Collections;

public class TransFollowMouse : MonoBehaviour
{
	
	private Vector3 _vec3TargetScreenSpace;// 目标物体的屏幕空间坐标
	private Vector3 _vec3TargetWorldSpace;// 目标物体的世界空间坐标
	private Transform _trans;// 目标物体的空间变换组件
	private Vector3 _vec3MouseScreenSpace;// 鼠标的屏幕空间坐标
	private Vector3 _vec3Offset;// 偏移
	
	void Awake( ) { _trans = transform; } 

    void Update()
    {
        if(Input.GetMouseButtonDown(0))
        {
            StartCoroutine(Translate());
        }
    }
	
	IEnumerator Translate( ) 
		
	{
        Debug.Log("in onmousedonw");
		// 把目标物体的世界空间坐标转换到它自身的屏幕空间坐标 
		
		_vec3TargetScreenSpace = Camera.main.WorldToScreenPoint(_trans.position);
		
		// 存储鼠标的屏幕空间坐标(Z值使用目标物体的屏幕空间坐标) 
		
		_vec3MouseScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, _vec3TargetScreenSpace.z);
		
		// 计算目标物体与鼠标物体在世界空间中的偏移量 
		
		_vec3Offset = _trans.position - Camera.main.ScreenToWorldPoint(_vec3MouseScreenSpace);
		
		// 鼠标左键按下 
		
		while ( Input.GetMouseButton(0) ) {
            Debug.Log("getmousebutton");
			// 存储鼠标的屏幕空间坐标(Z值使用目标物体的屏幕空间坐标)
			
			_vec3MouseScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, _vec3TargetScreenSpace.z);
			
			// 把鼠标的屏幕空间坐标转换到世界空间坐标(Z值使用目标物体的屏幕空间坐标),加上偏移量,以此作为目标物体的世界空间坐标
			
			_vec3TargetWorldSpace = Camera.main.ScreenToWorldPoint(_vec3MouseScreenSpace) + _vec3Offset;              
			
			// 更新目标物体的世界空间坐标 
			
			_trans.position = _vec3TargetWorldSpace;
			
			// 等待固定更新 
			
			yield return new WaitForFixedUpdate();
		} 
	}
}
或者
using UnityEngine;
using System.Collections;

public class TransFollowMouseForSensors : MonoBehaviour
{
	
	private Vector3 _vec3TargetScreenSpace;// 目标物体的屏幕空间坐标
	private Vector3 _vec3TargetWorldSpace;// 目标物体的世界空间坐标
	private Transform _trans;// 目标物体的空间变换组件
	private Vector3 _vec3MouseScreenSpace;// 鼠标的屏幕空间坐标
	private Vector3 _vec3Offset;// 偏移
	
	void Awake( ) { _trans = transform; } 
	
	IEnumerator OnMouseDown( ) 
		
	{
        Debug.Log("in onmousedonw");
		// 把目标物体的世界空间坐标转换到它自身的屏幕空间坐标 
		
		_vec3TargetScreenSpace = Camera.main.WorldToScreenPoint(_trans.position);
		
		// 存储鼠标的屏幕空间坐标(Z值使用目标物体的屏幕空间坐标) 
		
		_vec3MouseScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, _vec3TargetScreenSpace.z);
		
		// 计算目标物体与鼠标物体在世界空间中的偏移量 
		
		_vec3Offset = _trans.position - Camera.main.ScreenToWorldPoint(_vec3MouseScreenSpace);
		
		// 鼠标左键按下 
		
		while ( Input.GetMouseButton(0) ) {
            Debug.Log("getmousebutton");
			// 存储鼠标的屏幕空间坐标(Z值使用目标物体的屏幕空间坐标)
			
			_vec3MouseScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, _vec3TargetScreenSpace.z);
			
			// 把鼠标的屏幕空间坐标转换到世界空间坐标(Z值使用目标物体的屏幕空间坐标),加上偏移量,以此作为目标物体的世界空间坐标
			
			_vec3TargetWorldSpace = Camera.main.ScreenToWorldPoint(_vec3MouseScreenSpace) + _vec3Offset;              
			
			// 更新目标物体的世界空间坐标 
			
			_trans.position = _vec3TargetWorldSpace;
			
			// 等待固定更新 
			
			yield return new WaitForFixedUpdate();
		} 
	}
}

如果物体内部需要collider,可以用第一个

如果不流畅,第二个试一下。

2017-11-10 10:53:14 yiwei151 阅读数 1540
  • Unity3DUI系统(UGUI)初级入门

    本课程主要介绍Unity3d的UI系统(UGUI),先对UGUI做一个总体概述,之后对每个UI控件逐一进行详细讲述,内容包括控件的作用、设置方法、使用场景及属性细节,帮助大家熟练使用UGUI设计游戏的交互界面。

    977 人正在学习 去看看 伍晓波
    public GraphicRaycaster m_CanvasUI;
    public EventSystem eventSystem;

     private void Update()
    {
        if (Input.GetMouseButtonDown(0)) {
            CheckSecondUI(Input.mousePosition);
        }
     }

    /// <summary>
    /// 检测是否有第二层UI
    /// </summary>
    /// <returns></returns>
    public void CheckSecondUI(Vector2 pos)
    {
        List<GameObject> objList = new List<GameObject>();
        PointerEventData eventData = new PointerEventData(eventSystem);
        eventData.pressPosition = pos;
        eventData.position = pos;

        List<RaycastResult> list = new List<RaycastResult>();
        CanvasUI.Raycast(eventData, list);
        if (list.Count > 0)
        {
            for (int i = 0; i < list.Count; i++)
            {
                Debug.Log(list[i].gameObject.name);
            }
        }
        else {
            Debug.Log("没有UI");
        }
    }

当鼠标在屏幕上点击时,会打印出鼠标下所有的UI物体的名称

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