playXP

서브 메뉴

Page. 4 / 246 [내 메뉴에 추가]
글쓰기
작성자 아이콘 민동환빵셔틀
작성일 2021-07-01 10:03:49 KST 조회 1,002
제목
섬멸전 인공지능 길찾기가 필요합니다

제가 원하는 기능은

 

컴퓨터가 플레이어 1~6을 대상으로 각각 공격을 보내는 것인데

 

(일정 시간마다 컴퓨터 유닛이 스폰돼서, 각각의 플레이어(위치 랜덤) 상대로 공격 감)

 

이게 문제가.. 플레이어가 입구를 막아버리면 입구주변에서 뱅~ 돌기만 하더라고요

 

섬멸전으로 플레이해보면, 입구를 막더라도 공격을 잘 오는데

 

이걸 구현하는 방법이 없을까요?

지속적인 허위 신고시 신고자가 제재를 받을 수 있습니다.
신고 사유를 입력하십시오:

발도장 찍기
Cerenas (2021-07-01 14:35:27 KST)
0↑ ↓0
센스 이미지를 등록해 주세요
트리거를 어떻게 짜셨는지는 모르겠지만, 이동 경로 확인하는 조건이 있습니다.
https://www.playxp.com/sc2/galaxyqna/view.php?article_id=5578920&search=2&search_pos=&q=#!3

이렇게해서 만약 입구가 막혀서 컴퓨터 유닛이 플레이어의 위치로 갈 숭벗는 경우, 해당 유닛과 목표 플레이어 위치사이에 있는 구조물을 공격하도록 트리거를 짜면 될 것 같습니다.
아이콘 민동환빵셔틀 (2021-07-03 13:38:36 KST)
0↑ ↓0
센스 이미지를 등록해 주세요
ㄴ답변 감사합니다. 그런데 입구에 있는 건물을 공격하도록 하는 트리거는 어떻게 짜야하는 걸까요? 입구를 막고 있는 건물을 어떻게 특정해야하는지 막막하네요;;

아니면 그냥 섬멸전처럼 인공지능이 알아서 잘 공격오면 편한데 그거는 방법이 없을까요?
아이콘 민동환빵셔틀 (2021-07-03 14:38:21 KST)
0↑ ↓0
센스 이미지를 등록해 주세요
ㄴ 제가 만들고 있는 게 살아남기류 맵인데

중앙 혹은 맵의 특정 지역에서 적들이 스폰되고

그 적들이 플레이어들을 상대로 공격가도록 트리거를 짜고 있습니다.

유닛 그룹에 지시전달을 이용해서 공격 트리거를 짰는데

문제가... 플레이어가 언덕 입구를 막아버리면은 공격을 제대로 못 가네요;;
Cerenas (2021-07-03 17:29:47 KST)
0↑ ↓0
센스 이미지를 등록해 주세요
└에...섬멸전 인공지능을 사용하는 방법은 제가 몰라서 답변드릴 수가 없습니다...ㅜㅜ


제가 말한 트리거를 짜라고 하면,저라면 이렇게 하겠습니다.

변수(유닛 그룹) structures
변수(유닛) enemy
변수(유닛) targetplayerunit
변수(실수) distance

if 문 사용
enemy의 위치와 targetplayerunit의 위치의 이동경로 비용 검사
그 값이 65536(즉 도달할 수 없다)
then
일단 distance에 enemy와 targetplayerunit의 거리값을 저장합니다.
그리고 while 반복문을 돌립니다. 조건은 distance값이 0보다 크다
  반복문은
   유닛그룹에 유닛 그룹추가
    출처 유닛 그룹은
     조건에 일치하는 구역내 유닛
      ->원을 구역으로 변환
       ->지점을 향하는 지점 오프셋
        ->targetpoint:유닛의 위치
         ->유닛은targetplayerunit
      ->거리는 distance
    ->출처 지점:유닛의 위치
      -> 유닛은 enemy
    ->반경은 1.0
     ->유닛 필터는 '요구됨:구조물'
    -대상 유닛 그룹 : structures

  변수 수정 : distance-1.0


이제 이걸 해설해보자면

일단 enemy유닛이 있는 곳에서 targetplayerunit가 있는 곳까지 가려면 비용이 65536이다
-이건 결국 못간다이니까 조건이 OK
이제부터 enemy 유닛과 targetplayerunit의 사이에 있는 건물들을 찾아봅시다.

while문을 이용하기 전에, 두 유닛 사이의 거리를 구해 distance에 저장합니다. 10.0이라고 가정하겠습니다.

유닛 그룹 structures에 건물들을 넣어봅시다. 그러기 위해 일단 구역을 정해야겠죠.

출처 지점이 enemy유닛의 위치입니다. 그리고 거리는 10.0이죠. 방향은 targetplayerunit이 있는 위치입니다. 반경은 1.0으로 놔두죠.
이러면, enemy 유닛이 있는 위치에서, targetplayerunit 방향으로, 10.0만큼 떨어진 곳에서 반경 1.0 내에 있는 구조물을 structures라는 유닛 그룹에 추가합니다.
그리고 변수 수정으로 distance의 값에서 1.0을 뺍니다. 그러면 10.0이었으니 9.0이 되었겠죠?

다시 while 문의 조건을 보니 distance가 0보다 크다. 지금 9.0이니까 또 실행되겠네요?
그럼 이번엔 enemy 유닛이 있는 위치에서, targetplayerunit 방향으로 9.0 만큼 떨어진 곳에서 반경 1.0내에 있는 구조물들을 structures라는 유닛그룹에 추가합니다.
그리고 변수 수정으로 distance를 또 1.0 빼죠. 그러면 이제 8.0이 이 되었겠군요.

다시 while문의......반복!!!

해서 0보다 크다가 거짓이 될때까지 실행합니다.
그러면 이제, enemy유닛과 targetplayerunit 사이의 모든 1.0 간격의 지점에서 1.0 반경에 있는 구조물들은 죄다 structures라는 유닛 그룹에 들어가 있겠군요.

그럼 이제, enemy유닛은 targetplayerunit을 공격가기 전에, 이 structures에 있는 구조물들을 공격하도록 짜야 겠군요.



이 방법은 근데, 워낙 즉흥적으로 짠 방식이라 실제로 적용해보면 enemy유닛과 targetplayerunit의 수에, 거리에 따라 미친듯한 검색을 해야 하기 때문에 정말 욕나오는 렉을 유발할 수 있습니다.
이를 줄이기 위해서는 enemy 유닛 하나하나 따로 하는 것 보다는 적 유닛 그룹을 지정해서 그 그룹의 중심 유닛 하나와 targtplayerunit단 둘만 서로 경로 비용을 검사하는 방식으로 줄일 수 있고,
검색하는 범위도 1.0 거리마다, 1.0 반경씩 검사하는 걸 좀더 폭과 범위를 넓혀서 횟수를 줄이는 방식도 괜찮을테고...최적화는 결국 실제로 경험해보고 하는 수밖에 없으니까요.
저보다 고수님들은 훨씬 더 좋은 방식을 가지고 계실거라 생각합니다.




예전에 어떤 길막기류의 유즈맵에서는 구조물을 건설할때, 길이 막혀버리며 건설이 취소되게 해 놓은 맵도 있었습니다.(어느 맵인지는 기억나지 않습니다.)
이런건, 적 유닛들과 상관없이 구조물 건설시, 건물 위치와 적 스폰 위치를 검사해서 막히면 처치,내지는 취소 해버리는 식으로 구현한게 아닐까 싶습니다.
(제가 구현한게 아니라서 그냥 예상입니다. 실 제작자님께선 어떻게 구현했는지는 모릅니다.)



갤디터는 아래와 같이 됩니다.


   structures = (비어 있는 유닛 그룹) <유닛 그룹>
   enemy = 유닛 없음 <유닛>
   targetplayerunit = 유닛 없음 <유닛>
   distance = 0.0 <실수>



   레이블 -distance = ((enemy의 위치)(와)과 (targetplayerunit의 위치) 사이의 거리) 설정
   레이블 -If (조건) then (행동) else (행동)
    If
      ((enemy의 위치) 및 (targetplayerunit의 위치) 사이 이동 경로 비용) == 65536
     Then
      레이블 -While (조건) 참, do (행동)
       조건
        distance > 0.0
        행동
         레이블 -((구역(((targetplayerunit의 위치) 방향으로 distance 떨어진 (enemy의 위치) 오프셋), 1.0))에서 요구됨: 구조물; 배제됨: 미사일, 소멸됨, 숨김(와)과 일치하는 플레이어 아무 플레이어 소유 아무 유닛. 최대 아무 양개)에 있는 모든 유닛을 structures에 추가
         레이블 -distance 수정: - 1.0
     Else
아이콘 민동환빵셔틀 (2021-07-06 16:29:56 KST)
0↑ ↓0
센스 이미지를 등록해 주세요
ㄴ자세한 답변 너무 감사합니다ㅠㅠ
근데 제가 잘 구현을 못해서 다른 방법을 연구했는데...

컴퓨터의 공세대상을 플레이어로 설정하고
공세보내는 방식으로 트리거를 짰더니 잘 되는 거 같아요
Cerenas (2021-07-06 19:25:09 KST)
0↑ ↓0
센스 이미지를 등록해 주세요
해결됐다면 OK입니다!
댓글을 등록하려면 로그인 하셔야 합니다. 로그인 하시려면 [여기]를 클릭하십시오.
롤토체스 TFT - 롤체지지 LoLCHESS.GG
소환사의 협곡부터 칼바람, 우르프까지 - 포로지지 PORO.GG
배그 전적검색은 닥지지(DAK.GG)에서 가능합니다
  • (주)플레이엑스피
  • 대표: 윤석재
  • 사업자등록번호: 406-86-00726

© PlayXP Inc. All Rights Reserved.