답변을 단순화하기 위해 네임 스페이스에서 제공 Vector3
하는 사용자 정의 struct
가 UnityEngine
있습니다. 사용자 정의 class
또는 struct
유형 을 작성할 때 해당 연산자 도 정의 해야합니다 . 따라서 운영자에 대한 기본 논리는 없습니다 . 에 의해 지적 예브게니 바실리 예프 , 우리가 직접 확인할 수있는, 의미가 , 그리고 값을. a 는 세 개의 개별 값으로 표시 되므로 그다지 의미가 없습니다 .>=
_rect_tfm.position == _positionB
Vector3.x
Vector3.y
Vector3.z
_rect_tfm.position >= _positionB
Vector3
이론적으로Vector3
적합한 연산자를 포함 하도록 클래스를 오버로드 할 수는 있지만 다소 복잡해 보입니다. 대신 적절한 방법으로 클래스 를 간단하게 확장 하는 것이 더 쉬울 것 입니다. 말하자면, 당신은 운동 에이 논리를 사용하려는 것 같습니다. 따라서이 방법 을 사용하는 것이 훨씬 쉬울 수 있습니다 . 그렇다면 아래에서 자세히 읽으십시오.Vector3
Vector3.Lerp
확장 메소드 추가 Vector3
앞에서 언급했듯이 <=
또는 >=
에 적용 하는 Vector3
것은 종종 비논리적입니다. 이동의 경우 Vector3.Lerp
메소드에 대한 추가 정보를 원할 것입니다 . 즉, <=
=>
다른 이유로 산술 을 적용하고 싶을 수 있으므로 쉬운 대안을 제공 할 것입니다.
Vector3 <= Vector3
또는 의 논리를 적용하는 대신 및에 대한 메소드를 포함 Vector3 >= Vector3
하도록 Vector3
클래스를 확장하는 것이 좋습니다. 확장 메소드 를에 추가 하거나 상속하지 않는 클래스 에서 선언하여 추가 할 수 있습니다 . 또한 키워드를 사용하여 대상 또는 첫 번째 매개 변수를 포함합니다 . 필자의 예제에서는 세 가지 기본 값 ( , 및 )이 모두 각각 크거나 같거나 더 작거나 같다는 것을 의미한다고 가정합니다 . 필요에 따라 여기에 고유 한 논리를 제공 할 수 있습니다.isGreaterOrEqual(Vector3 other)
isLesserOrEqual(Vector3)
struct
class
static
class
struct
this
x
y
z
public static class ExtendingVector3
{
public static bool IsGreaterOrEqual(this Vector3 local, Vector3 other)
{
if(local.x >= other.x && local.y >= other.y && local.z >= other.z)
{
return true;
}
else
{
return false;
}
}
public static bool IsLesserOrEqual(this Vector3 local, Vector3 other)
{
if(local.x <= other.x && local.y <= other.y && local.z <= other.z)
{
return true;
}
else
{
return false;
}
}
}
Vector3
클래스 에서 이러한 메서드를 호출하려고하면 메서드를 호출 local
하는 Vector3
인스턴스 가 나타납니다 . 방법은 다음과 같습니다 static
. 확장 방법이 있어야 할 static
,하지만 당신은 여전히 인스턴스에서 호출해야합니다. 위의 확장 방법이 주어지면 이제 Vector3
유형에 직접 적용 할 수 있습니다.
Vector3 left;
Vector3 right;
// Is left >= right?
bool isGreaterOrEqual = left.IsGreaterOrEqual(right);
// Is left <= right?
bool isLesserOrEqual = left.IsLesserOrEqual(right);
Vector3
와 함께 이동Vector3.Lerp
메소드를 호출 하면Vector3.Lerp
Vector3
주어진 시간에 두 값 사이의 정확한 위치를 결정할 수 있습니다 . 이 방법의 추가 혜택이 있다는 것이다 (가) Vector3
목표를 오버 슛을하지 않습니다 . Vector3.Lerp
세 가지 매개 변수를 취합니다. 시작 위치, 종료 위치 및 현재 위치는 0과 1 사이의 값으로 표시됩니다. 결과 위치를로 출력 Vector3
하여 현재 위치로 직접 설정할 수 있습니다.
문제를 해결하기 Vector3.Lerp
위해를 사용하여을 제안 합니다 targetPosition
. Move
각각 에서 메소드를 호출 한 후 Update
, 우리가 목표에 도달했는지 확인할 수 있습니다. Lerp.Vector3
윌 하지 오버 슈트, 그래서 transform.position == targetPosition
믿을된다. 우리는 지금의 위치를 확인하고 변경할 수 있습니다 targetPosition
에 leftPosition
또는 rightPosition
이에 따라, 움직임을 반전 할 수 있습니다.
public Vector3 leftPosition, rightPosition;
public float speed;
public Vector3 targetPosition;
private void Awake()
{
targetPosition = rightPosition;
}
private void Update()
{
Move();
if(transform.position == targetPosition)
{
// We have arrived at our intended position. Move towards the other position.
if(targetPosition == rightPosition)
{
// We were moving to the right; time to move to the left.
targetPosition = leftPosition;
}
else
{
// We were moving to the left; time to move to the right.
targetPosition = rightPosition;
}
}
}
private void Move()
{
// First, we need to find out the total distance we intend to move.
float distance = Vector3.Distance(transform.position, targetPosition);
// Next, we need to find out how far we intend to move.
float movement = speed * Time.deltaTime;
// We find the increment by simply dividing movement by distance.
// This will give us a decimal value. If the decimal is greater than
// 1, we are moving more than the remaining distance. Lerp
// caps this number at 1, which in turn, returns the end position.
float increment = movement / distance;
// Lerp gives us the absolute position, so we pass it straight into our transform.
transform.position = Vector3.Lerp(transform.position, targetPosition, increment);
}
다음 애니메이션에서이를 확인할 수 있습니다. 파란색 큐브를로 번역하면 Vector3.LerpUnclamped
간단한 확인되지 않은 번역과 비슷한 결과가 나타납니다. 을 사용하여 빨간색 큐브를 번역합니다 Vector3.Lerp
. 체크하지 않으면 파란색 큐브가 망각으로 이동합니다. 빨간 입방체는 내가 의도 한 곳에서 정확하게 멈 춥니 다. 이 유형의 이동 에 대한 자세한 내용 은 스택 오버플로 설명서를 참조하십시오 .
Bools
처럼_atPosA
하고_atPosB
. 필연적으로, 둘 다 동기화 상태를 유지하는 실수를 저지르면 버그가 발생할 수 있습니다.enum