[사각형] 가상 로터 C# 코드 섹션(2) - 핵심 코드
클릭 위치의 상대 위치 가져오기
RectTransformUtility를 사용합니다.ScreenPointToLocalPointInRectangle(rectTransform, Input.mousePosition, canvas.worldCamera, out pos) 방법.
#region -Vector2 ReturnMouseDownPos()
private Vector2 ReturnMouseDownPos() {
Vector2 pos;
if (RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, Input.mousePosition, canvas.worldCamera, out pos))
//if bool , 。
{
return pos;
}
else {
return pos;
}
}
#endregion
획득한 클릭 위치를 통해 로터 중심의 거리를 계산한다
마우스 점에서 중심점까지의 상대 위치
pos는 canvas 기준 좌표계로, 이 코드는 좌표계를 Point 중심 기준 Vector2 relativePos = new Vector2 ((pos.x - this.transform.localPosition.x)로 변환합니다(pos.y - this.transform.localPosition.y).
마우스 클릭과 중심점의 거리를 계산하다
float distance = Mathf.Sqrt((relativePos.x*relativePos.x) + (relativePos.y*relativePos.y)); 직각 삼각형의 변장 계산 공식인 Mathf를 사용합니다.Sqrt() 메서드는 루트를 나타냅니다.
거리에 따라 다른 피드백을 취하다
1. 거리가 30픽셀보다 작고 가상 로터 이동
if (distance <= 30f)
{
// ,
Narrow(ControlPanel);//
isFollowMouse = true;//
}
2. 거리가 30픽셀보다 크고 방향을 바꾸는 것은 각각 x와 y의 양과 음의 번호를 판단하여 이동하는 방향을 확정하고 방향 속성을 수정한다.
if (Mathf.Abs(relativePos.x) >= Mathf.Abs(relativePos.y))
{
if (relativePos.x >= 0)
{
heroDistance = HeroDistance.Right;
UpdateCountrolDirection();
}
else
{
heroDistance = HeroDistance.Left;
UpdateCountrolDirection();
}
}
else
{
if (relativePos.y >= 0)
{
heroDistance = HeroDistance.Top;
UpdateCountrolDirection();
}
else
{
heroDistance = HeroDistance.Bottom;
UpdateCountrolDirection();
}
}
이동 방향에 따라 컨트롤의 표시와 운동 방향을 바꾸다
대상 속성의 변화를 검측하고 실제 요구에 따라 상응하는 피드백을 한다.
#region -UpdateCountrolDirection()
private void UpdateCountrolDirection() {
if (!isFollowMouse && GameControl._instance.gameState == GameControl.GameState.Playing) {
if (heroDistance == HeroDistance.None)
{
for (int i = 0; i < ControlDirection.Length; i++)
{
ControlDirection[i].SetActive(false);
}
GameControl._instance.direction = GameControl.Direction.None;
}
else if (heroDistance == HeroDistance.Top)
{
// ,
if (GameControl._instance.direction != GameControl.Direction.Bottom) {
for (int i = 0; i < ControlDirection.Length; i++)
{
ControlDirection[i].SetActive(false);
}
ControlDirection[0].SetActive(true);
GameControl._instance.direction = GameControl.Direction.Top;
}
}
else if (heroDistance == HeroDistance.Bottom)
{
// ,
if (GameControl._instance.direction != GameControl.Direction.Top) {
for (int i = 0; i < ControlDirection.Length; i++)
{
ControlDirection[i].SetActive(false);
}
ControlDirection[1].SetActive(true);
GameControl._instance.direction = GameControl.Direction.Bottom;
}
}
else if (heroDistance == HeroDistance.Left)
{
// ,
if (GameControl._instance.direction != GameControl.Direction.Right) {
for (int i = 0; i < ControlDirection.Length; i++)
{
ControlDirection[i].SetActive(false);
}
ControlDirection[2].SetActive(true);
GameControl._instance.direction = GameControl.Direction.Left;
}
}
else if (heroDistance == HeroDistance.Right)
{
// ,
if (GameControl._instance.direction != GameControl.Direction.Left) {
for (int i = 0; i < ControlDirection.Length; i++)
{
ControlDirection[i].SetActive(false);
}
ControlDirection[3].SetActive(true);
GameControl._instance.direction = GameControl.Direction.Right;
}
}
}
}
#endregion
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Unity 최적화1. 프레임마다 처리하는 것을 최대한 피한다. 예를 들면: 5프레임당 한 번 처리로 변경할 수 있습니다. 2. 정시 반복 처리는 InvokeRepeating 함수로 이루어집니다. 예를 들어 0.5초 동안 시작한 후 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.