3월24일 오전2시 포스팅 시작
일단 어제 만든 폭탄 프리팹을 마무리 했다.
이제 저 rangebox 를 투명처리만 하면 완전 끝
오늘은 초록이 프리팹을 만들고
제한 범위 내에서 랜덤하게 좌우로 돌아다니게 하고,
만약 캐릭터가 범위 안에 들어오게 되면
캐릭터를 향해 움직이며
hit 범위 안에 들어오면, attack 애니메이션을 재생하도록 해보자
리지드바디랑 콜라이더를 설정해주고
플레이어를 탐지할 범위와 공격 범위를 만들어 주고
해주고
플레이어의 위치와 비교해서 애니메이션을 재생시키고 싶었는데
다른 스크립트의 변수 접근하는걸 좀 찾았다
https://blog.naver.com/PostView.nhn?blogId=jaejae1988&logNo=221246173357&categoryNo=45&parentCategoryNo=0&viewDate=¤tPage=1&postListTopCurrentPage=1&from=postView
이분 블로그를 보고 다른 스크립트의 변수에 접근 하는 법을 배웠다
시야범위 안에 들어오면 플레이어의 방향으로 공격을 하게끔 설정했다
애니메이션이 끊임없이 재생되는데, 이제 공격에 쿨타임을 줘보자
애니메이션 파라미터와 쿨타임간 조정하는데만 또 1시간 걸렸다 ㅋㅋ
해서 초록이가 때릴때 플레이어가 박스 안에 있다면 데미지를 주게 했고
잘 되는것까지 확인했고
이제 저 범위 안에 들어오면 플레이어의 방향으로 direction 을 고정하고
플레이어가 q keydown 했을때 범위 안에 있다면 죽도록 해보자
오늘 작업 끝!
greeny 코드
public class greeny : MonoBehaviour
{
public float speed=10.0f;
public bool horizontal=true;
public float changeTime = 5.0f;
Rigidbody2D rigidbody2D;
float timer;
int direction = 1;
private bool isAttacking=false;
Animator animator;
float atk_cooltime=3.0f;
float atk_timer=1.0f;
bool dir_for_player=false;
float time_keepdir=5.0f;
public Transform sight_pos;
public Vector2 sight_boxSize;
public Transform right_hit_pos;
public Vector2 right_hit_boxSize;
public Transform left_hit_pos;
public Vector2 left_hit_boxSize;
GameObject greeny_obj;
// Start is called before the first frame update
void Start()
{
rigidbody2D = GetComponent<Rigidbody2D>();
animator = GetComponent<Animator>();
}
// Update is called once per frame
void Update()
{
Vector2 position = rigidbody2D.position;
player call = GameObject.Find("WALK_R_Clown_1").GetComponent<player>();
Vector2 player_pos = call.player_pos;
timer -= Time.deltaTime;
if (dir_for_player) {
if (player_pos.x - position.x <=0) {
direction = -1;
animator.SetBool("isLeft", true);
time_keepdir-=Time.deltaTime;
if (time_keepdir<=0) {
dir_for_player=false;
}
} else {
direction = 1;
animator.SetBool("isLeft", false);
time_keepdir-=Time.deltaTime;
if (time_keepdir<=0) {
dir_for_player=false;
}
}
} else {
if (timer < 0)
{
direction = -direction;
timer = changeTime;
if (direction>0) {
animator.SetBool("isLeft", false);
} else {
animator.SetBool("isLeft", true);
}
}
}
if (!isAttacking)
{
position.x = position.x + Time.deltaTime * speed * direction;
}
Collider2D[] sight_collider2Ds = Physics2D.OverlapBoxAll(sight_pos.position, sight_boxSize, 0);
foreach (Collider2D collider in sight_collider2Ds) {
if (collider.tag == "Player") {
//Debug.Log("player is within greenys sight");
dir_for_player=true;
if (atk_timer<=0) {
Debug.Log("atk_timer <= 0");
if (player_pos.x > position.x) {
animator.SetBool("right_atk",true);
isAttacking=true;
animator.SetBool("isAttacking", true);
atk_timer=atk_cooltime;
} else {
animator.SetBool("left_atk",true);
isAttacking=true;
animator.SetBool("isAttacking", true);
atk_timer=atk_cooltime;
}
} else {
//Debug.Log("atk_timer-=time.deltatime");
atk_timer=atk_timer-Time.deltaTime;
animator.SetBool("right_atk",false);
animator.SetBool("left_atk",false);
}
}
}
rigidbody2D.MovePosition(position);
}
private void OnDrawGizmos() {
Gizmos.color=Color.blue;
Gizmos.DrawWireCube(sight_pos.position, sight_boxSize);
Gizmos.DrawWireCube(right_hit_pos.position, right_hit_boxSize);
Gizmos.DrawWireCube(left_hit_pos.position, left_hit_boxSize);
}
private void atk_end() {
isAttacking=false;
animator.SetBool("isAttacking", false);
Debug.Log("atk_end()");
}
private void left_atk_hit() {
Collider2D[] collider2Ds = Physics2D.OverlapBoxAll(left_hit_pos.position, left_hit_boxSize, 0);
foreach (Collider2D collider in collider2Ds) {
if (collider.tag == "Player") {
collider.GetComponent<player>().ChangeHealth(-1);
}
}
}
private void right_atk_hit() {
Collider2D[] collider2Ds = Physics2D.OverlapBoxAll(sight_pos.position, sight_boxSize, 0);
foreach (Collider2D collider in collider2Ds) {
if (collider.tag == "Player") {
collider.GetComponent<player>().ChangeHealth(-1);
}
}
}
public void hit(string greeny_name) {
greeny_obj=GameObject.Find(greeny_name);
Destroy(greeny_obj);
}
}
플레이어의 q keydown 도 수정했다
if (Input.GetKeyDown(KeyCode.Q)) { //q키 상호작용
animator.SetBool("attacking",true);
RaycastHit2D obj_hit = Physics2D.Raycast(rigidbody2d.position + Vector2.up * 0.2f, lookDirection, 2.0f, LayerMask.GetMask("react_q_obj"));
string obj_N=obj_hit.collider.gameObject.name;
string obj_tag = obj_hit.collider.tag;
if (obj_tag == "balls" ) {
if (obj_hit.collider != null) {
Debug.Log("keydown Q : " + obj_hit.collider.gameObject);
balls judge_ball = obj_hit.collider.GetComponent<balls>();
if (judge_ball != null)
{
if (judge_ball.hit(obj_N)) {
curse_count = curse_count - 1;
Debug.Log("left curse_count : " + curse_count);
} else {
ChangeHealth(-1);
}
} else { ;}
}
}
else if (obj_tag == "greeny") {
if (obj_hit.collider != null) {
Debug.Log("keydown Q : " + obj_hit.collider.gameObject);
greeny judge_greeny = obj_hit.collider.GetComponent<greeny>();
judge_greeny.hit(obj_N);
}
}
else if (obj_tag == "McD") {
if (obj_hit.collider != null) {
Debug.Log("keydown Q : " + obj_hit.collider.gameObject);
McD judge_mcd = obj_hit.collider.GetComponent<McD>();
judge_mcd.hit(1);
}
}
else {;}
} else {
animator.SetBool("attacking", false);
}
이전 방식으로는 레이캐스트를 하나만 받아올 수 있는것 같아서
q keydown 에 반응하는 오브젝트들의 레이어를 통일하고
tag로 반응을 구분했다
맥도날드도 2번 공격하면 죽도록 구현해봤다.
오늘은 여기까지 하고 내일은
오늘 제작한 초록이들을 숫자에 맞게 맵에 모두 배치하고,
w 점프 길이에 맞게 바닥 길이를 수정하고,
미사일 프리팹을 구현해볼 예정이다
아 맞다 그리고 지금 bounceball 이 바닥에 내려 찍을때 데미지가 들어가는게 아니라
설정된 리지드바디에 스쳐도 데미지가 들어오도록 되어있는데
이부분도 손봐야할 것 같다
오늘은 끝! 술사러가야지!
https://github.com/cyanindy/Unity/tree/main/3mario/Assets/Script
현재 제작중인 쿠크세이튼3마리오 프로젝트는 깃허브에 public 으로 업로드 되있습니다.