Unity3D開發之放大效果的實現

    demo效果如下圖:


    實現思路:1.發射射線判斷是否碰撞以及獲取和模型碰撞的點。

                    2.根據是否碰撞設置是否顯示放大效果Panel。

                    3. 將碰撞點座標轉換到屏幕座標 設置Panel位置。

                    4.創建一個專門用於旋轉放大細節的攝像機,輸出的貼圖放到Panel上。根據碰撞點位置設置攝像機的位置。

    我們項目多個場景時會經常用到射線檢測,所以我們把射線檢測相關的方法以及獲取到的值封裝到一個類裏,供全局調用。代碼如下:

using UnityEngine;

public class RayObject{

    private Camera maincamera;
    private RaycastHit hit;
    private string tag = "Model";
    private Vector3 rayPoint;

    public GameObject RayGameOb { get { return GetRayGameObject(); } }

    public bool IsRayGameOb { get { return IsRayGameObject(); } }

    public Vector3 RayPoint { get { return rayPoint; } }

    public RayObject(Camera camera,string name)
    {
        maincamera = camera;
        tag = name;
    }

    //獲取被射線檢測到的物體
    private GameObject GetRayGameObject()
    {
        Ray ray = maincamera.ScreenPointToRay(Input.mousePosition);
        if (Physics.Raycast(ray, out hit))
        {
            if (hit.collider.CompareTag(tag))
            {
                rayPoint = hit.point;
                return hit.collider.gameObject;
            }
            return null;
        }
        return null;
    }

    //是否射到指定物體上
    private bool IsRayGameObject()
    {
        Ray ray = maincamera.ScreenPointToRay(Input.mousePosition);
        if (Physics.Raycast(ray, out hit))
        {
            if (hit.collider.CompareTag(tag))
            {
                rayPoint = hit.point; return true;
            }
            return false;
        }
        return false;
    }
}

然後,我們創建一個掛載於場景上運行開啓的腳本,代碼如下:

public class MagnifyEffect : MonoBehaviour {

    [SerializeField]
    private GameObject MagnifyPanel;
    [SerializeField]
    private Camera MagnifyCamera;
    RayObject rayObject;
    private RectTransform canvas;
    // Use this for initialization
    void Start () {
        rayObject = new RayObject(Camera.main,"Model");
        canvas = GameObject.Find("Canvas").GetComponent<RectTransform>();
    }
	
	// Update is called once per frame
	void Update ()
    {
        if(rayObject.IsRayGameOb)
        {
            MagnifyPanel.SetActive(true);
            Vector2 pos;
            RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas,Input.mousePosition,null,out pos);
            MagnifyPanel.transform.localPosition = pos;
            //print(rayObject.RayPoint);
            Vector3 cameraPos = MagnifyCamera.transform.position;
            MagnifyCamera.transform.position = new Vector3(rayObject.RayPoint.x, rayObject.RayPoint.y, cameraPos.z);
        }
        else
        {
            MagnifyPanel.SetActive(false);
        }
    }

    
}
    以上就是實現的代碼。對於Camera輸出的貼圖設置參考之前博客,模型顯示在UI前面有講對於貼圖的設置。希望對你有幫助。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章