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前面有講對於貼圖的設置。希望對你有幫助。