参考博客 : http://www.manew.com/blog-123323-22409.html
最终实现效果:(数字显示的位置不对,找了很久也不知道什么原因,有大神知道后,评论一下)
就直接上代码了:
拖动小球移动的代码:
using UnityEngine;
using System.Collections;
public class DragToMove : MonoBehaviour {
void Update()
{
if(Input.GetMouseButton(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if(Physics.Raycast(ray.origin,ray.direction, out hit))
{
Vector3 hitPoint = hit.point;
transform.position = new Vector3(hitPoint.x, 3.5f, hitPoint.z);
}
}
}
}
显示数字的代码:
using UnityEngine;
using System.Collections;
public class ShowSizeManager : MonoBehaviour
{
public static ShowSizeManager _Instance;
public TextMesh one;
public TextMesh two;
public TextMesh three;
public TextMesh four;
void Start()
{
_Instance = this;
one = transform.FindChild("1").GetComponent<TextMesh>();
two = transform.FindChild("2").GetComponent<TextMesh>();
three = transform.FindChild("3").GetComponent<TextMesh>();
four = transform.FindChild("4").GetComponent<TextMesh>();
}
public void ShowText(Vector3 point, float distance, string type)
{
distance = Mathf.Round(distance);
switch (type)
{
case "1":
one.GetComponent<MeshRenderer>().enabled = true;
one.transform.position = point;
one.text = distance.ToString();
break;
case "2":
two.GetComponent<MeshRenderer>().enabled = true;
two.transform.position = point;
two.text = distance.ToString();
break;
case "3":
three.GetComponent<MeshRenderer>().enabled = true;
three.transform.position = point;
three.text = distance.ToString();
break;
case "4":
four.GetComponent<MeshRenderer>().enabled = true;
four.transform.position = point;
four.text = distance.ToString();
break;
}
transform.LookAt(-Camera.main.transform.position);
}
public void HideMesh(string type)
{
switch(type)
{
case "1": one.GetComponent<MeshRenderer>().enabled = false; break;
case "2": one.GetComponent<MeshRenderer>().enabled = false; break;
case "3": one.GetComponent<MeshRenderer>().enabled = false; break;
case "4": one.GetComponent<MeshRenderer>().enabled = false; break;
}
}
}
画线的代码:
using UnityEngine;
using System.Collections;
public class RenderSize : MonoBehaviour
{
public static RenderSize _instance;
public GameObject go;
private LineRenderer forward;
private LineRenderer back;
private LineRenderer left;
private LineRenderer right;
void Start()
{
_instance = this;
forward = transform.FindChild("forward").GetComponent<LineRenderer>();
back = transform.FindChild("back").GetComponent<LineRenderer>();
left = transform.FindChild("left").GetComponent<LineRenderer>();
right = transform.FindChild("right").GetComponent<LineRenderer>();
}
void FixedUpdate()
{
RayCheck(go);
}
private void RayCheck(GameObject go)
{
Check(go, Vector3.forward, forward, "1");
Check(go, Vector3.back, back, "2");
Check(go, Vector3.left, left, "3");
Check(go, Vector3.right, right, "4");
}
private void Check(GameObject go, Vector3 Direction, LineRenderer line, string type)
{
RaycastHit hit;
if (Physics.Raycast(go.transform.position, Direction, out hit, 100))
{
line.enabled = true;
Debug.DrawLine(go.transform.position, hit.point, Color.red);
Vector3 v0 = go.transform.position;
Vector3 v2 = hit.point;
line.SetPosition(0, v0);
line.SetPosition(1, v2);
float distance = Vector3.Distance(go.transform.position, hit.point);
Vector3 point = (transform.position + hit.point) / 2;
ShowSizeManager._Instance.ShowText(point, distance, type);
}
else
{
line.enabled = false;
ShowSizeManager._Instance.HideMesh(type);
}
}
}