2014-10-04 5 views
-1

각 그리드 크기 1x1 단위 (기본값)와 함께 그리드 기반 수준이 있습니다. 내 게임 대상을 특정 방향 (팩맨)으로 가속하는 차선을 통해 '방향을 바꾸기 위해 입력이 나올 때까지 또는 죽음의 벽과 충돌하여 오른쪽으로 돌 때까지 어떻게해야합니까? 움직임은 타일의 중간에 정렬해야합니다. 플레이어 오브젝트의 레벨의 예가 아래에 나와 있습니다. 녹색 물체가 플레이어이고 빨간색 실린더가 목표이고 그림의 시나리오는 입력 버튼을 누르지 않은 경우입니다. 그러면 플레이어 객체가 자동으로 왼쪽으로 돌아갈 수 있습니다.팩맨은 입력이 일정한 운동을하는 것과 같이 레이크 내부에서 차선을 돌리고 벽과의 충돌을 자동으로 켜는 것이 가능합니까?

Screenshot

+0

아무 것도 시도해 보지 않으셨습니까? 당신이 묻는 것은 기본적이고 참고 문헌은 쉽게 Google에서 찾을 수 있기 때문에 나는 추측하고 있습니다 ... – Savlon

답변

0

@Savlon. 예, 했어요. 현재는 키를 눌렀을 때만 움직일 수 있습니다. 그러면 타일이 걸을 수 있는지 여부를 확인합니다. 그리고 그럴 경우 이동이 수행됩니다. 키를 누르고있는 동안 만 이런 일이 발생합니다. 아래 코드는 동일한 코드입니다.

public GameObject levelCreator_; 
levelCreator temp; 
Vector3 playerPos; 

int[,] mapArray = new int[13,17]; 
public bool inhibitPlayerInput; 

void Start() { 
    DOTween.Init(true, true, LogBehaviour.Verbose).SetCapacity(6000, 6000); 

    levelCreator_ = GameObject.Find ("LevelCreatorGameObject"); 
    temp = levelCreator_.gameObject.GetComponent<levelCreator>(); 
    mapArray = temp.mapArray; 
    for(int i = 1; i<12; i++) 
    { 
     for(int ii = 1; ii < 16; ii++) 
     { 
      if(mapArray[i,ii] == 2)  // tile with value 2 is the starting position of the player 
      { 
       playerPos = new Vector3(i,ii,0); 
      } 
     } 
    } 

    transform.position = new Vector3(playerPos.x,playerPos.y,0); 
} 

void Update() { 
    if (inhibitPlayerInput) return; 
    getInput(); 
} 

void getInput() 
{ 
    bool inputPressed = false; 
    Vector3 newPlayerPos = playerPos; 

    if(Input.GetKey(KeyCode.W)) 
    { 
     inputPressed = true; 
     newPlayerPos += new Vector3(-1,0,0); 
    } 
    else if (Input.GetKey(KeyCode.S)) 
    { 
     inputPressed = true; 
     newPlayerPos += new Vector3(1,0,0); 
    } 
    else if(Input.GetKey(KeyCode.A)) 
    { 
     inputPressed = true; 
     newPlayerPos += new Vector3(0,-1,0); 
    } 
    else if(Input.GetKey(KeyCode.D)) 
    { 
     inputPressed = true; 
     newPlayerPos += new Vector3(0,1,0); 
    } 

    if (!inputPressed) return; 

    if (mapArray[(int)newPlayerPos.x,(int)newPlayerPos.y] == 1)  // Unwalkable tile check 
    { 
     return; 
    } 
    playerPos = newPlayerPos; 

    if(mapArray[(int)playerPos.x,(int)playerPos.y] == 0 || mapArray[(int)playerPos.x,(int)playerPos.y] >= 2) 
    { 
     inhibitPlayerInput = true; 
     transform.DOMove(playerPos, TweenWpDuration).OnComplete(() => inhibitPlayerInput = false).SetEase(Ease.Linear); 
     return; 
    } 
}