20240822 도전과제ing
도전과제
1. 엔터를 눌러서 공격 애니메이션을 실행하고
공격 애니메이션 실행이 끝나면 Idle애니메이션을 실행한다
2. 좌우버튼눌러 이동할때 (HOLD) 엔터키를 누르면 정지후 공격 애니메이션을 실행한다
공격 애니메이션 실행이 끝나면 Idle애니메이션을 실행한다
업그레이드 버전
공격 애니메이션 종료 후 좌우버튼이 눌러져 있다면
해당 방향으로 이동을 계속한다(Run 애니메시션 실행)
시험
king
테스쳐2D 스프라이트로 만들고 피봇 설정
애니메이션 만들기
-Idle, Move, Attack
애니메이터 컨트롤러에서 파라미터 만들고 트랜지션만들고 설정
키보드 좌우 눌러서 이동( 이동중 애니메이션 실행)
-리지드바디 2D에서 velocity사용해서 이동하기
-좌우 키보드 눌렀을때 오브젝트 반전
-이동중 애니메이션 실행
엔터키 눌러서 공격 애니메이션 실행
-공격 애니메이션이 끝나면 Idle 또는 Move애니메이션 실행
pig
애니메이션 만들기
-Idle, Hit, Dead
컨트롤러에서 파라미터 만들고 트래지션만들고 설정(애니메이션 전환을 위해)
1.king이 pig근처로 이동해서 엔터키를 누르면 king이 공격 애니메이션을 한다
2.king과 pig의 거리를 계산한다
3.일정 거리(공격사거리)가 되면 pig는 Hit애니메이션을 한다
4.king에 공격력 속성을 부여하고 pig에는 체력 속성을 설정한다
5.pig가 공격을 받으면 pig의 체력을 king의 공격력 만큼 감소시킨다
6.pig의 체력이 0이 되면 Dead 애니메이션을 실행한다
Updata에 추가
if(isAttacktime)
{
this.curAttackTime += Time.deltaTime;
}
pigdead
Debug.Log("isPigdead) 출력
if(isPigFead) return;
if문들어가기전 pighp 출력
이동ok
공격력 10 , 모션 ok
pig체력 100/100 적용 ok
공격할때마다 10씩 차감 ok
pig한테 갔다가 뒤로 이동하는 모션 이상해짐 ok
공격할때 멈추질 못함
pig 모션 바뀌지 않음
pig 체력이 0이 되어도 계속 공격가능 -로 넘어감 ok...응 ok 아니야
=> 일정 사거리에서 공격 가능 사거리에 들어가지 못하면 "팔이짧아" 출력
=> 방금 출력되는걸 확인했는데 뭘만진거니... 왜 다시 마이너스가 뜨는거니...?
왜 사람맘을 들었다 놨다 하니, 데이브레이크야?
ok
-어택타임 고정 /공격모션 할때마다 0.3 세팅
-타임은 계속 늘어나서(업데이트) 어택타임보다 커지거나 같아질때 키 입력받아서 if문 실행이 되게 설정
-타임이 어택타임보다 작을때는 실행하면 안되고 델타타임만 더해주기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PigContorller : MonoBehaviour
{
public Animator animator;
public Collider2D Collider2D;
public int pigHp;
public int pigMaxHp;
public GameObject kingGo;
public KingController kingController;
public PigContorller pigContorller;
public bool isPigDead;
void Start()
{
kingController = kingGo.GetComponent<KingController>();
animator = pigContorller.GetComponent<Animator>();
this.pigHp = 100;
this.pigMaxHp = 100;
Debug.Log($"Pig의 체력 : {this.pigHp}/{this.pigMaxHp}");
}
void Update()
{
PigDead();
}
public void PigDead()
{
if( isPigDead ) return;
float pigH = Input.GetAxisRaw("Horizontal");
if(this.kingController.pigHp > 0)
{
animator.SetInteger("pigstate", 0);
}
else if(this.kingController.pigHp >= 0)
{
animator.SetInteger("pigstate", 1);
}
else if (this.kingController.pigHp < 0)
{
animator.SetInteger("pigstate", 2);
isPigDead = true;
Debug.Log("Pig Dead");
}
}
}
using System.Collections;
using System.Collections.Generic;
using System.Security.Cryptography;
using Unity.VisualScripting;
using UnityEngine;
public class KingController : MonoBehaviour
{
public Animator animator;
public Rigidbody2D rb2D;
public float moveSpeed;
private bool isMoveStop;
private bool isAttacktime;
private float curAttackTime = 0f; // 간격 타이머
private float attackTime = 0.6f; // 간격 시간
private bool isAttack;
public GameObject kingGo;
public GameObject pigGo;
public KingController kingController;
public PigContorller pigContorller;
public int kingDamage;
private int pigHp;
private int pigMaxHp;
private Transform pigTrans;
private Vector3 kingPos;
private void Start()
{
kingController = kingGo.GetComponent<KingController>();
pigContorller = pigGo.GetComponent<PigContorller>();
animator = kingController.GetComponent<Animator>();
this.pigTrans = GameObject.Find("Pig").transform;
Debug.Log($"킹 공격력: {kingDamage}");
}
// Update is called once per frame
public void Update()
{
KingMove();
}
// 멈춰 = 달려 / 멈춰서 때려
// 달려 = 멈춰 / 달리다 멈춰서 때려
// 때려 = 멈춰 / 멈추고 달려
public void KingMove()
{
float h = Input.GetAxisRaw("Horizontal");
if (h == 0f)
{
// 멈춰있음
animator.SetInteger("state", 0);
KingAttack();
}
else if (h != 0)
{
animator.SetInteger("state", 1);
this.rb2D.velocity = new Vector2(h * moveSpeed, 0);
this.transform.localScale = new Vector3(h, 1, 1);
KingAttack();
}
}
public void KingAttack()
{
if (Input.GetKeyDown(KeyCode.Return))
{
this.curAttackTime += Time.deltaTime;
this.isAttacktime = true;
}
if (curAttackTime > 0 && curAttackTime < 0.6f && Input.GetKeyDown(KeyCode.Return))
{
animator.SetInteger("state", 2);
curAttackTime = attackTime;
this.isAttacktime = false;
this.rb2D.velocity = Vector2.zero;
CheckAndAttack();
Debug.Log("King Attack");
}
else if(curAttackTime >=0.6f && Input.GetKeyDown(KeyCode.Return))
{
this.curAttackTime += Time.deltaTime;
this.rb2D.velocity = Vector2.zero;
animator.SetInteger("state", 2);
CheckAndAttack();
Debug.Log("King Attack");
}
}
public void KingDamage(int pigHp, int pigMaxHp, int kingDamage)
{
pigContorller.PigDead();
this.pigHp = this.pigContorller.pigMaxHp;
this.pigMaxHp = this.pigContorller.pigMaxHp;
this.pigContorller.pigHp -= this.kingDamage;
Debug.Log($"Pig의 체력: {this.pigContorller.pigHp}/{this.pigContorller.pigMaxHp}");
}
public void CheckAndAttack()
{
this.kingPos = this.transform.position;
Debug.Log($"kingPos: {kingPos}");
float dirX = pigTrans.transform.position.x - this.kingGo.transform.position.x;
if(dirX > 1.30f && dirX > -7.80f)
{
Debug.Log($"dirX: {dirX}");
Debug.Log("팔이짧아");
}
else
{
KingDamage(pigHp,pigMaxHp,kingDamage);
}
}
}