[Ihoo] 좀더 자세하게 AI 제작 해봅시다. > 기초 이해 강좌

본문 바로가기
사이트 내 전체검색

기초 이해 강좌

[Ihoo] 좀더 자세하게 AI 제작 해봅시다.

페이지 정보

profile_image
작성자 Leona123
댓글 0건 조회 576회 작성일 24-10-03 17:48

본문

무겐의 캐릭들은 AI 차이가 많이 납니다.. AI가 좋고 기술이 더러운 경우는 짜증이 나지만.. 개인적으로 기술판정이 적당하고 AI가 좋으면 아주 좋아합니다.  물론 AI가 별로이면 할맛이 안나죠.
  AI 가 없을 경우 무겐의 기본 AI 로 싸우긴 합니다만, 별로...

  먼저 제작법부터..
 
  무겐에서는 AI를 발동하게 하는 방법이 두가지 있습니다(제가 아는 걸로는..;)
1. 커맨드 이용(CMD)
2. 헬퍼 이용(CNS)


------------ 1. 커맨드를 이용한 방법. 예를 들어 설명해 보겠습니다.

(CMD파일에서)

[Command]
name = "AI_1"
command = U,D,F,F,B,B
time = 1

   아시다시피 위와같이 '위,밑,앞,앞,뒤,뒤' 를 1/60초 안에 입력한다는건 사람인 이상 불가능 합니다. 즉 CPU만이 할수 있다는 얘기죠.. 고로 다음과 같은 방법으로..

[statedef -2]   ;이건 항상 실행한다는 뜻인데 이 아래의 state들은 항상 실행되게 됩니다. -부분
                      의 숫자는 2라고 고정된게 아니라 4미만으로 아무거나 넣으셔도 됩니다. 한 cmd
                      나 cns파일에는 이런 것들이 2개이상 있으면 인식을 못하니(즉 없다면 새로 써주
                      고 있다면 안써도 됨) 주의를...
[state -2, 1]
type = varset
trigger1 = command = "AI_1"
var(10) = 1

     이것은 위의 "AI_1"이란 커맨드가 입력되었을 때 VAR(10)의 값을 1로 만든다는 뜻인데
  [statedef -?] 밑에 있으니 캐릭터가 뭔짓을 하든 항상 체크하게 되죠. 사람은 저 "AI_1"이란 커
  맨드를 입력불가능 이므로 컴퓨터에 의해서만 var(10) 이 1로 변할수 있죠. 여기서는 VAR(10)
  이 1로 변하는 걸 AI가 발동한다 라고 부르게 됩니다.
  이제 아래와 같이 AI용 기술들을 넣을 수 있습니다.

  '스테이트번호 1000' 이 대공기(류나 캔의 워류갠;;)라고 칩시다.

[state -2]
type = ChangeState
value = 1000
trigger1 = var(10) = 1                  ;var(10) 이 1이어야 하므로 사람은 못쓰죠.
trigger1 = statetype != A             
trigger1 = ctrl
trigger1 = p2movetype = A
trigger1 = p2bodydist X <= 40
trigger1 = random <= 200

  분석해 보면 캐릭터가 지상에 있고 키입력이 가능할 때 상대방이 공격하는 중이고 상대편과의  몸거리가 40이하일 때 약 1/5확률로 대공기를 쓴다는 뜻입니다. 이해가 되셨는지...

 

 


---------- 2. 헬퍼를 이용한 방법. 이것은 무겐에서 플레이어 캐릭터와 헬퍼의 키 인식의 다른점
                   을 이용한 방법입니다.

    이것 또한 예를 들어 설명해 보겠습니다.(CNS 파일에서)

일단 cns 끝부분에 'AI 발동 또는 취소용 헬퍼'를 만들기 위해 *부분을 써줘야 합니다.

*[Statedef -?];역시 CNS안에 이미 있다면 안써도 됨(?부분의 숫자는 아무거나 4미만으로..
                                                  거의 모든캐릭이 있음)
*[State -2, 0]
*type = Helper
*trigger1 = NumHelper(999) = 0        ;아이디 999인 헬퍼가 하나도 없을 때(즉 한 개만 발생시킴)
*trigger1 = RoundState = 2               ;싸움이 시작됐을 때
*name = "AI Trigger"                       ;헬퍼의 이름, 안써도 상관없음.
*id = 999                                        ;헬퍼의 아이디를 999로 설정
*pos = 1000,1000                             ;헬퍼의 위치, 아무숫자나 써도 상관없음.
*stateno = 1234                               ;헬퍼의 스테이트 번호, 여기서는 1234로 정했습니다.
*keyctrl = 1                                    ;헬퍼가 플레이어의 키입력을 인식함.꼭 써줘야 함.

★ 무겐에서는 사람이 커맨드를 입력했을 경우 기본 캐릭터도 인식을 하고 헬퍼도 인식을 합니다(위의keyctrl = 1을 꼭 써야 함).하지만 컴퓨터가 입력했을 경우에는 기본캐릭터만 인식을 하고 헬퍼는 인식하지 못합니다. 바로 이점을 이용한 것입니다.(컴퓨터가 캐릭을 움직일때만 AI발동)


-- 여기서부터는 헬퍼의 내용입니다.-- (여기서 var(10)과 var(11)은 헬퍼가 쓰는게 아니라 둘다 플레이어 캐릭이 쓰는 것입니다. 그래서 앞에 parent, 를 붙이는 것입니다.)

; AI helper
[Statedef 1234]
anim = 1234    ;여기의 애니매이션 번호는 AIR에 스프라이트가 없는 번호로 만들어야 합니다..(투명하
ctrl = 0       ;게 하기위해)

                    ;예)(SFF파일에서 0,999번이 그림이 없을 경우)(AIR 에서)  
                      [begin action 1234]
                      0,999,0,0,1

[State 111, 1]                ;이 3줄은 플레이어 캐릭터와 방향을 같게 해주는 것인데 올바른 키 인
type = Turn                   ;식을 위해 꼭 써줘야 합니다.
trigger1 = facing != parent, facing

[State 112, 2]                      ;이 17줄은 플레이어 캐릭터가 키입력을 받았을 경우 var(10)을
type = ParentVarSet               ;1로 만드는 것입니다. 즉 어떤 동작을 하던 var(10)은 1이 됩니다.
triggerall = parent, RoundState = 2
triggerall = time > 0 && parent,var(11) = 0; AI발동은 한번만 되게 한다.
triggerall = parent, movetype != H  ;이 줄은 버그방지를 위해 꼭 써줘야 합니다. 무겐 특성상 안
trigger1 = parent, command = "x"           ;써주면 맞는 도중 AI가 제멋대로 발동합니다.
trigger2 = parent, command = "y"           ;(뭐 발동해도 다시 취소할수 있지만 안정성을 위해..)
trigger3 = parent, command = "z"
trigger4 = parent, command = "a"
trigger5 = parent, command = "b"
trigger6 = parent, command = "c"
trigger7 = parent, command = "s"
trigger8 = parent, command = "holdfwd"
trigger9 = parent, command = "holdback"
trigger10 = parent, command = "holdup"
trigger11 = parent, command = "holddown"
var(10) = 1

[State 113, 3]                    ;이 15줄은 플레이어 캐릭터도 키입력을 받고 동시에 헬퍼도 입력
type = ParentVarSet               ;을 받았을 경우(사람이 키를 누른 경우) var(10)을 다시 0으로 만
triggerall = parent, RoundState = 2       ;들어 AI가 발동하지 않게(또는 취소) 하는 것입니다.
triggerall = parent,var(11) = 0    ;이줄은 도스무겐이면 안써도 되지만 윈무겐일 경우 써야 합니다.
trigger1 = (command = "x" && parent, command = "x")     ;이유는 밑에설명
trigger2 = (command = "y" && parent, command = "y")
trigger3 = (command = "z" && parent, command = "z")
trigger4 = (command = "a" && parent, command = "a")
trigger5 = (command = "b" && parent, command = "b")
trigger6 = (command = "c" && parent, command = "c")
trigger7 = (command = "s" && parent, command = "s")
trigger8 = (command = "holdfwd" && parent, command = "holdfwd")
trigger9 = (command = "holdback" && parent, command = "holdback")
trigger10 = (command = "holdup" && parent, command = "holdup")
trigger11 = (command = "holddown" && parent, command = "holddown")
var(10) = 0

[State 112, 2]                     ;이 16줄은 맨 처음 키입력을 하면 var(11)을 1로 만들어 첫부분의
type = ParentVarSet                 ;var(10)을 1로 만드는 부분이 실행되지 않게 합니다.
triggerall = parent, RoundState = 2  ;즉 AI발동은 처음 한번만 되게 됩니다.(안정성을 위해...)
triggerall = time > 0            ;또한 이렇게 하면 트레이닝 모드시 아무키나 한번 누르면 그후로는
trigger1 = parent, command = "x"  ;AI 발동이 안되게 됩니다
trigger2 = parent, command = "y"
trigger3 = parent, command = "z"
trigger4 = parent, command = "a"
trigger5 = parent, command = "b"
trigger6 = parent, command = "c"
trigger7 = parent, command = "s"
trigger8 = parent, command = "holdfwd"
trigger9 = parent, command = "holdback"
trigger10 = parent, command = "holdup"
trigger11 = parent, command = "holddown"
var(11) = 1

   참고로 제 캐릭에서는 두가지 방법을 모두 씁니다. var의 값이나 번호는 캐릭마다 다를수 있습니다.

 

 --- 윈무겐 관련입니다. ---

  윈무겐에서 AI가 제대로 작동하지 않는 경우가 있습니다. 산도씨 캐릭이라든가...도스무겐캐러중에 AI

를 헬퍼를 이용한 방법을 쓸경우 그렇게 되는데 원인은 AI발동 헬퍼에서 AI가 자꾸 취소가 되기 때문입

니다.


  원래 헬퍼를 이용한 AI발동원리가 사람이 키를 입력했을때와 CPU가 입력했을때 캐릭터와 헬퍼의 키인

식의 차이를 이용한 것이었지만...

  윈무겐에서는 헬퍼도 키인식을 할 때가 있는것 같습니다. 헬퍼가 키인식을 하면 사람이 키를 누른것과

같은 효과를 내기 때문에 AI가 취소가 되버립니다. 헬퍼가 항상 키인식을 하는게 아니고 할때가 있고 안

할때가 있는것 같습니다.

 

  그래서 저는 VAR를 하나 써서 AI가 발동되든 사람이 키를 누르건 간에 AI가 한번 발동되면 취소가 안

되게 해버렸습니다. 작은 단점이라면 트레이닝 모드에서 아무키나 누르기 전에 AI를 발동시키면 취소가

안된다는것.

  위에 설명된 헬퍼를 이용한 AI발동방법에서 두번째 parentvarset부분 트리거에 parent,var(11) = 0

부분이 있는 이유는 이것때문입니다. 만약 이걸 쓰지 않으면 윈무겐에서 AI는 정상작동하지 않습니다.

(써도 간혹 풀릴때가 있음)


  여기까지입니다.

추천0

댓글목록

등록된 댓글이 없습니다.


개인정보취급방침 이용약관 모바일 버전으로 보기 상단으로

Copyright © 무겐 어소시에이션 All rights reserved.