Peurandel 3d3d482e35a54679a3c22d0f505dc661
게임버전 | 1.13.x, 1.14.x, 1.15.x, 1.16.x, 1.17.x, 1.18.x, 1.19.x, 1.20.x |
---|
* 주의 해당 강좌는 초보를 위한 강좌가 아니며, 커맨드의 모든 문법에 대해 숙지하고 있어야합니다.
이번글 목차
- 1. 기본세팅
- 2. 세컨드 @s
1. 기본세팅
당신이 커맨드로 컨텐츠를 제작할때 가장 큰 문제를 하나 손꼽으라고 한다면 여러가지가 있지만 난 렉을 선택할 것이다.
이 글을 읽는 많은 사람도 이 문제를 겪었을 것이다.
커맨드가 렉걸리는 이유는 무엇일까?
말해뭐해 당연히 엔티티다.
그중에서도. 타겟셀렉터 ( @e, @a, @s 등 )
이 녀석의 원리는 @e를 기준으로 모든 엔티티를 일단 호출한 다음 셀렉터의 조건 인자들에 부합하는 엔티티들을 "하나하나 비교하여" 엔티티를 셀렉팅한다.
이는 커맨드에 타겟셀렉터가 작성될때마다 거치는 과정이며
설마 당신의 타겟셀렉터가 단 한마리의 엔티티만을 가리키더라도 이 과정은 거치기에 미세한 렉을 발생시킨다.
그렇기에 우리는 @s를 적극 사용하여야한다.
give @e[tag=a] stick 1
execute at @e[tag=a] run fill x y z.....
scoreboard players add @e[tag=a] score 1
우린 이런식의 커맨드를
execute as @e[tag=a] at @s run function
#give @s stick 1
#fill x y z......
#scoreboard players add @s score 1
로 바꿔 쓸 수 있다. 둘은 정확히 같은 작업을 수행하지만, 타겟셀렉터가 호출되면서 낭비하는 연산들이 유의미하게 줄어들고 @e[tag=a] 를 포함해야하는 커맨드가 늘어날수록 이방식은 더더욱 효과적인 시너지를 일으킨다.
이것은 단순히 최적화의 효과만을 낳진 않는다.
*(중요)각각의 엔티티가 위 커맨드들을 모두 실행한 다음, 다음 엔티티가 실행하기 때문에 기존 커맨드블럭에서 작업하던 방식이 주던 엔티티 오차 현상 ( 정확히 동일 좌표에서 동일 조건의 다른 엔티티가 커맨드를 실행한다던지, 마커와 돼지와 같이 일대일 대응하던 두 종류의 엔티티 집단에서 필연적인 연산 에러가 발생한다던지 )이 완화될 수 있다.
2. 세컨드 @s
만약 당신이 총을 쏜다고 가정하자. 총알은 재귀함수로 앞으로 이동하며 맞은 엔티티에게 대미지를 가한다.
다만 이 총알이 플레이어의 위치에서부터 출발한다면 분명 당신도 총알에 맞을 것이다.
이걸 방지하기 위해 우린 세컨드 @s가 필요하다.
세컨드 @s 실행자를 호출할 수 있는 또다른 셀렉터를 구축하는 작업이다.
우린 tag를 통해 제2의 셀렉터를 구축할 수 있다.
execute as @e[tag=a] at @s run function
#tag @s add this
#summon marker ~ ~ ~ {Tags:[bullet]} //총알
#execute as @e[tag=bullet] at @s run function
##대충 구문들
##damage @e[tag=!this,distance=..0.5] 10 by @s //태그가 this인 엔티티에게 데미지를 가한다.
#kill @e[tag=bullet]
#tag @s remove this
이것 또한 execute의 인자 as가 타겟셀렉터 조건에 부합하는 첫번째 엔티티를 호출하고 run 뒤 명령어를 완벽히 실행한 다음에 그 다음 엔티티가 똑같은 작업을 반복하는 원리를 이용한 것이다.
댓글이 없습니다.
새로운 댓글을 등록해 주세요!