빌드 2019 (16 세 XVII)에 유니티 게임 프레임 워크 localPosition 단순화하고 다시 변환

마지막에서 우리는 작은 도구 화면 해상도 감지를 수집했다. 그리고 오늘 더 아래를 살펴 봅니다.

문제

우리는 오늘 탐구. 다소 필요 변환 작동 UI 또는 쓰기 게임 플레이를 작성 여부.

나는 통일에 새 때 매우 익숙하지 못한 곳이있다. 그것은 위치, 각도, 줌 할당을 변환하는 것입니다.

예를 들어, 경우에만 transform.localPosition.x 할당입니다.

코드 작성한다.

var localPosition = transform.localPosition;
localPosition.x = 5.0f;
transform.localPosition = localPosition;

또는 쓰기

transform.localPosition = new Vector3(5.0f,transform.localPosition.y,transform.localPosition.z)

Vector3이 구조체 타입이기 때문입니다. 우리는 객체의 복사본을 수신 값 유형으로 이해할 수있는 것은 오히려 참조를 할당하는 것보다, Vector3 값입니다. 당신이 어린이 신발, 제안 된 검색을 이해하지 못하는 경우 구문은 C #을 조금 세부입니다.

빠른-Cocos2dx 필요에 단 한 줄의 코드 만은 충분하다.

self:setPositionX(5)

참고 :이 루아 코드입니다.

그것의 저자는, 감동 유니티하기 전에,이 습관을 없애 자연스럽게 어려운, 2 년 Cocos2dx을하기 위해 학교에서 실행하기 시작합니다. 원칙은 매우 간단하기 때문에 단순히 자신을 작성합니다.

다음과 같이 코드입니다 :

#if UNITY_EDITOR
using UnityEditor;
#endif

using UnityEngine;

namespace QFramework
{
	public class TransformLocalPosImprovements
	{
#if UNITY_EDITOR
		[MenuItem("QFramework/10.Transform 赋值优化")]
#endif
		private static void GenerateUnityPackageName()
		{
			var transform = new GameObject("transform").transform;

			SetLocalPosX(transform, 5.0f);
		}

		public static void SetLocalPosX(Transform transform, float x)
		{
			var localPos = transform.localPosition;
			localPos = x;
			transform.localPosition = localPos;
		}
	}
}

코드, 그것은 약자의 위치 포스 될 것입니다 방법 이름의 길이를 고려, 이해하기 쉽습니다.

실행 결과 코드는 다음과 같습니다 :
006tNc79gy1fzdi1ise58j31aa0e2n06.jpg

결과는 정확합니다.

지원 Y 및 Z

또한 X, Y 및 Z를 또한 우리 지원에 대한 지원을 변환하기 그들은 또한 매우 자주 사용하기 때문에.

다음과 같이 코드입니다 :

		public static void SetLocalPosY(Transform transform, float y)
		{
			var localPos = transform.localPosition;
			localPos.y = y;
			transform.localPosition = localPos;
		}
		
		public static void SetLocalPosZ(Transform transform, float z)
		{
			var localPos = transform.localPosition;
			localPos.z = z;
			transform.localPosition = localPos;
		}

XY, XZ 및 YZ 지원

물론, XY, XZ 및 YZ는 동등하게 지원을 필요로한다. 그러나 여기 너무, 당신은 실제로 두 가지 옵션이 있습니다 :

  1. 전화 SetPositionX, SetPositionY, SetPositionZ
  2. 로직 전체 달성하기 위해

첫 번째 장점은 코드를 재사용 할 수 있지만 통화가 이루어질 때마다, 사실, 복사 동작의 값 타입이다. 그것은 성능의 관점에서 바람직하지 않습니다.

두 번째 장점은 성능이 상대적으로 더 나은,하지만 코드의 양을 증가시킬 것입니다.

함께 찍은, 두 번째를 선택합니다.

다음과 같이 코드입니다 :

		public static void SetLocalPosXY(Transform transform, float x, float y)
		{
			var localPos = transform.localPosition;
			localPos.x = x;
			localPos.y = y;
			transform.localPosition = localPos;
		}
		
		public static void SetLocalPosXZ(Transform transform, float x, float z)
		{
			var localPos = transform.localPosition;
			localPos.x = x;
			localPos.z = z;
			transform.localPosition = localPos;
		}
		
		public static void SetLocalPosYZ(Transform transform, float y, float z)
		{
			var localPosition = localPos;
			localPos.y = y;
			localPos.z = z;
			transform.localPosition = localPos;
		}

코드는 어려운 아무것도 아니다.

다음과 같이 모든 코드는 다음과 같습니다

#if UNITY_EDITOR
using UnityEditor;
#endif

using UnityEngine;

namespace QFramework
{
	public class TransformLocalPosImprovements
	{
#if UNITY_EDITOR
		[MenuItem("QFramework/10.Transform 赋值优化")]
#endif
		private static void GenerateUnityPackageName()
		{
			var transform = new GameObject("transform").transform;

			SetLocalPosX(transform, 5.0f);
			SetLocalPosY(transform, 5.0f);
			SetLocalPosZ(transform, 5.0f);
		}

		public static void SetLocalPosX(Transform transform, float x)
		{
			var localPos = transform.localPosition;
			localPos.x = x;
			transform.localPosition = localPos;
		}
		
		public static void SetLocalPosY(Transform transform, float y)
		{
			var localPos = transform.localPosition;
			localPos.y = y;
			transform.localPosition = localPos;
		}
		
		public static void SetLocalPosZ(Transform transform, float z)
		{
			var localPos = transform.localPosition;
			localPos.z = z;
			transform.localPosition = localPos;
		}
		
		public static void SetLocalPosXY(Transform transform, float x, float y)
		{
			var localPos = transform.localPosition;
			localPos.x = x;
			localPos.y = y;
			transform.localPosition = localPos;
		}
		
		public static void SetLocalPosXZ(Transform transform, float x, float z)
		{
			var localPos = transform.localPosition;
			localPos.x = x;
			localPos.z = z;
			transform.localPosition = localPos;
		}
		
		public static void SetLocalPosYZ(Transform transform, float y, float z)
		{
			var localPos = transform.localPosition;
			localPos.y = y;
			localPos.z = z;
			transform.localPosition = localPos;
		}
	}
}

이것은 우리의 10 번째 예이다.

우리는 유도 될 수있다.

다시 변환

오늘 우리는 우리의 변환 후 더 아래를 살펴 봅니다.

우리는 종종 스케일링 값이 리셋되어,이 논리하는 변환 위치, 회전 물품.

다음과 같이 코드입니다 :

transform.localPosition = Vector3.zero;
transform.localScale = Vector3.one;
transform.localRotation = Quaternion.identity;

그것은 항상 코드를 작성해야합니다.

방법 우리는 다음과 추출 후 :

#if UNITY_EDITOR
using UnityEditor;
#endif

using UnityEngine;

namespace QFramework
{
	public class TransformIdentity : MonoBehaviour
	{
		
#if UNITY_EDITOR
		[MenuItem("QFramework/11.Transform 归一化")]
#endif
		private static void MenuClicked()
		{
			var transform = new GameObject("transform").transform;

			Identity(transform);
		}

		/// <summary>
		/// 重置操作
		/// </summary>
		/// <param name="trans">Trans.</param>
		public static void Identity(Transform transform)
		{
			transform.localPosition = Vector3.zero;
			transform.localScale = Vector3.one;
			transform.localRotation = Quaternion.identity;
		}
	}
}

코드의 실행 결과는 정확합니다.

그런 사람은 무엇을 의미 하는가 신원을 물어볼 것입니다? 신원 실제 행렬의 형태이며, 사선은 1이고, 아래와 같이 다른 모든 부분은 모두 0이다.
006tNc79gy1fzdi20inapj302b03lgle.jpg

본질적으로 4 × 4 행렬 실제로,이 매트릭스는 매트릭스, 회전 및 스케일링 값의 위치를 ​​기록 할 수있다 변환된다. 위치에 대응하는 행렬을 변환하는 1 확장, 0, 회전 값 Quaternion.identity 같은 매트릭스.

여기서 학생들은 그 초점은 위의 코드를 달성하기 위해 식별 방법이 아닙니다 문제이다 않습니다 이해가 안 돼요.

OK, 여기, 우리는 한 번 유도 할 수 있습니다.

지금까지 우리는 10 샘플을 수집했다. 전체 수확, 우리는 바로, 더 많은 예제를 수집해야합니까?

이러한 오늘의 내용.

주소 무단 전재 지정하십시오 샌들 노트 : liangxiegame.com

추천

출처www.cnblogs.com/liangxiegame/p/12617707.html