ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Unity3D 在运行时实现物体的移动、旋转、伸缩控制

2022-01-30 10:03:02  阅读:196  来源: 互联网

标签:Unity3D objs 伸缩 objDummy 旋转 width GetComponent drawRect height


using UnityEngine;
using System.Collections;
public class PickMe : MonoBehaviour
{
	enum Mode { SELECT, OPER };
	Mode operMode;
	Rect drawRect = new Rect();
	bool drawSelectRect = false;
	GameObject objDummy;
	ArrayList arya = new ArrayList();
	GameObject[] objChoosen;
	Shader[] matChoosen;
	Transform[] objParent;
	public Material lineMat;
	public GameObject lineShader;
	void Start()
	{
		/*	lineMat=new Material( "Shader \"Lines/Colored Blended\" {" +
									  "SubShader { Pass { " +
									  "    Blend SrcAlpha OneMinusSrcAlpha " +
									  "    ZWrite Off Cull Off Fog { Mode Off } " +
									  "    BindChannels {" +
									  "      Bind \"vertex\", vertex Bind \"color\", color }" +
									  "} } }" );*/
		objDummy = new GameObject("Dummy");
		operMode = Mode.SELECT;
		//	lineMat.SetColor("_Color",new Color(1f,1f,1f,0.2f));
	}
	void OnGUI()
	{
		GUI.Label(new Rect(0, 0, 400, 20), "Left Click drag to Choose Object,Right Click to Cancel Choose");
		GUI.Label(new Rect(0, 30, 100, 90), "Alpha1 move Alpha2 Rotate Alpha3 Scale");
		GUI.Label(new Rect(0, 80, 300, 90), "Mouse mid and alt button to move and rotate the camera ");
	}
	void Update()
	{
		if (Input.GetMouseButtonDown(0) && operMode == Mode.SELECT)
		{
			drawRect.x = Input.mousePosition.x;
			drawRect.y = Input.mousePosition.y;
			drawSelectRect = true;
		}
		if (Input.GetMouseButtonDown(1))
		{
			operMode = Mode.SELECT;
			GizmoRender gzr = objDummy.GetComponent<GizmoRender>();
			Destroy(gzr);
			for (int i = 0; i < objChoosen.Length; i++)
			{
				if (objChoosen[i] != null)
				{
					if (objChoosen[i].GetComponent<Renderer>() != null)
						objChoosen[i].GetComponent<Renderer>().material.shader = matChoosen[i];
					objChoosen[i].transform.parent = objParent[i];
					BoundRender gzrs = objChoosen[i].GetComponent<BoundRender>();
					Destroy(gzrs);
				}
			}
			objDummy.transform.DetachChildren();
			objDummy.transform.position = Vector3.zero;
			objDummy.transform.localEulerAngles = Vector3.zero;
			objDummy.transform.localScale = new Vector3(1, 1, 1);
			arya.Clear();
		}
		if (Input.GetMouseButtonUp(0) && operMode == Mode.SELECT)
		{
			FixRect(ref drawRect);
			drawSelectRect = false;
			GameObject[] objs = GameObject.FindGameObjectsWithTag("Choose");
			objs = AddChildObject(objs);
			objChoosen = new GameObject[objs.Length];
			matChoosen = new Shader[objs.Length];
			objParent = new Transform[objs.Length];
			int k = 0;
			for (int i = 0; i < objs.Length; i++)
			{
				Mesh sharedMesh = null;
				Bounds bonds = new Bounds();
				if (objs[i].GetComponent<MeshFilter>() == null || objs[i].GetComponent<MeshRenderer>() == null)
				{
					if (objs[i].GetComponent<SkinnedMeshRenderer>() == null)
					{
						continue;
					}
					else
					{
						sharedMesh = objs[i].GetComponent<SkinnedMeshRenderer>().sharedMesh;
						bonds = objs[i].GetComponent<SkinnedMeshRenderer>().GetComponent<Renderer>().bounds;
					}
				}
				else
				{
					MeshFilter meshfilter = objs[i].GetComponent<MeshFilter>();
					MeshRenderer meshRender = objs[i].GetComponent<MeshRenderer>();
					sharedMesh = meshfilter.sharedMesh;
					bonds = meshRender.GetComponent<Renderer>().bounds;
				}
				Vector3[] vertices;
				vertices = sharedMesh.vertices;
				Vector3 vec3 = Vector3.zero;
				Vector2 vec2 = Vector2.zero;
				for (int j = 0; j < vertices.Length; j++)
				{
					vec3 = GetComponent<Camera>().WorldToScreenPoint(objs[i].transform.TransformPoint(vertices[j]));
					vec2.x = vec3.x;
					vec2.y = vec3.y;
					if (drawRect.Contains(vec2))
					{
						if (objs[i].GetComponent<BoundRender>() == null)
						{
							objs[i].AddComponent<BoundRender>();
							objDummy.transform.position += bonds.center;
							operMode = Mode.OPER;
							objChoosen[k] = objs[i];
							matChoosen[k] = objs[i].GetComponent<Renderer>().material.shader;
							objChoosen[k].GetComponent<Renderer>().material.shader = Shader.Find("Transparent/Diffuse");
							k++;
						}
						break;
					}
				}
			}
			if (k != 0)
			{
				objDummy.transform.position /= k;
				for (int j = 0; j < k; j++)
				{
					if (objChoosen[j].GetComponent<MeshCollider>() != null)
						objChoosen[j].GetComponent<MeshCollider>().enabled = false;
					objParent[j] = objChoosen[j].transform.parent;
					objChoosen[j].transform.parent = objDummy.transform;
				}
				if (objDummy.GetComponent<GizmoRender>() == null)
				{
					objDummy.AddComponent<GizmoRender>();
					objDummy.GetComponent<GizmoRender>().eAxis = true;
				}
			}
		}
		if (drawSelectRect && operMode == Mode.SELECT)
		{
			drawRect.height = Input.mousePosition.y - drawRect.y;
			drawRect.width = Input.mousePosition.x - drawRect.x;
		}
		if (Input.GetKeyDown(KeyCode.Alpha1))
		{
			if (objDummy.GetComponent<GizmoRender>())
			{
				objDummy.GetComponent<GizmoRender>().eAxis = true;
				objDummy.GetComponent<GizmoRender>().eRotate = false;
				objDummy.GetComponent<GizmoRender>().eScal = false;
			}
		}
		if (Input.GetKeyDown(KeyCode.Alpha2))
		{
			if (objDummy.GetComponent<GizmoRender>())
			{
				objDummy.GetComponent<GizmoRender>().eAxis = false;
				objDummy.GetComponent<GizmoRender>().eRotate = true;
				objDummy.GetComponent<GizmoRender>().eScal = false;
			}
		}
		if (Input.GetKeyDown(KeyCode.Alpha3))
		{
			if (objDummy.GetComponent<GizmoRender>())
			{
				objDummy.GetComponent<GizmoRender>().eAxis = false;
				objDummy.GetComponent<GizmoRender>().eRotate = false;
				objDummy.GetComponent<GizmoRender>().eScal = true;
			}
		}
	}
	void FixRect(ref Rect rect)
	{
		if (rect.width < 0)
		{
			rect.x += rect.width;
			rect.width = -rect.width;
		}
		if (rect.height < 0)
		{
			rect.y += rect.height;
			rect.height = -rect.height;
		}
	}
	GameObject[] AddChildObject(GameObject[] objs)
	{
		for (int i = 0; i < objs.Length; i++)
		{
			arya.Add(objs[i]);
			CountChildren(objs[i].transform);
		}
		GameObject[] objret = new GameObject[arya.Count];
		for (int j = 0; j < arya.Count; j++)
			objret[j] = (GameObject)arya[j];
		return objret;
	}
	void CountChildren(Transform c)
	{
		foreach (Transform a in c)
		{
			if (a.gameObject.CompareTag("Choose"))
			{
				break;
			}
			else
			{
				arya.Add(a.gameObject);
			}
			CountChildren(a);
		}
	}
	void OnRenderObject()
	{
		if (drawSelectRect)
		{
			lineMat.SetPass(0);
			GL.Color(new Color(1f, 1f, 1f, 0.2f));
			GL.PushMatrix();
			GL.LoadOrtho();
			GL.Begin(GL.QUADS);
			if (drawRect.width * drawRect.height < 0)
			{
				GL.Vertex3(drawRect.x / Screen.width, drawRect.y / Screen.height, 0);
				GL.Vertex3((drawRect.x + drawRect.width) / Screen.width, drawRect.y / Screen.height, 0);
				GL.Vertex3((drawRect.x + drawRect.width) / Screen.width, (drawRect.y + drawRect.height) / Screen.height, 0);
				GL.Vertex3(drawRect.x / Screen.width, (drawRect.y + drawRect.height) / Screen.height, 0);
			}
			else
			{
				GL.Vertex3(drawRect.x / Screen.width, drawRect.y / Screen.height, 0);
				GL.Vertex3(drawRect.x / Screen.width, (drawRect.y + drawRect.height) / Screen.height, 0);
				GL.Vertex3((drawRect.x + drawRect.width) / Screen.width, (drawRect.y + drawRect.height) / Screen.height, 0);
				GL.Vertex3((drawRect.x + drawRect.width) / Screen.width, drawRect.y / Screen.height, 0);
			}
			GL.End();
			GL.PopMatrix();
		}
	}
}

  

标签:Unity3D,objs,伸缩,objDummy,旋转,width,GetComponent,drawRect,height
来源: https://www.cnblogs.com/guangzhiruijie/p/15856398.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有