-
Notifications
You must be signed in to change notification settings - Fork 2
develop SkillFiringSystem
Seong Hyeok OH edited this page Mar 10, 2023
·
28 revisions
- 무기를 프리팹 후 무기에 "Weapon"을 적용
- 캐릭터에게 "Character"을 적용
- "SkillFiringSystem"(스크립트가 적용된 빈 오브젝트)에 "Weapon"와 "Character"을 적용
- 몬스터에게 "Monster"을 적
- 무기와 몬스터에게 collider2D 적용
- 이론 1-1. 무기에 관한 세세한 내용을 구현한 스크립트와 모든 무기 공통적인 부분을 "Weapon"에 넣고 이 둘을 무기에 적용 1-2. 캐릭터에 세세한 내용을 구현한 스크립트와 "Character"에 넣고 이 둘을 캐릭터에 적용
- "Weapon"과 "Character"에서 각각의 스탯을 가져와 "SkillFiringSystem"에 적용
- 무기를 얻을 때마다 "SkillFiringSystem"(스크립트가 적용된 빈 오브젝트)가 등장하도록 (미구현)
private void Attack()
{
AttackCalculation(); //공격 관련 계산
for (int i = 0; i <= numberOfProjectiles; i++) //투사체 수만큼 발사하기
{
FireWeapon();
}
}
//무기 발사
//ToDo: attackRange을 적용하기
private void FireWeapon()
{
float timediff = cooldown; //쿨타임
timer += Time.deltaTime; //시간 갱신
GameObject monster = GameObject.FindWithTag("Monster");
if (timer > timediff) //쿨타임 넘을 시
{
GameObject newobs = Instantiate(weapon); //무기 로드
newobs.transform.position = character.transform.position; //캐릭터 위치에 생성
newobs.GetComponent().Shoot(projectileSpeed); //"Weapon"스크립트에서 무기 벡터대로 날아감
if (OnTriggerEnter2D(weapon.GetComponent())) //무기가 몬스터와 부딪힘 감지
{
monster.GetComponent().Health -= damage; //딜 계산
Destroy(monster, 0); //몬스터 삭제
if (monster.GetComponent().Health <= 0) //몬스터가 죽는다면
{
GameObject obj = Resources.Load("Object/Capsule"); //임펙트 등장
Destroy(obj, 1); //임펙트 등장 시간
}
}
timer = 0; //시간 초기화
Destroy(newobs, duration); //지속 시간 지나면 삭제
}
}
bool OnTriggerEnter2D(Collider2D weapon)
//rigidBody가 무언가와 충돌할때 호출되는 함수로 Collider2D other로 부딪힌 객체를 받아옵니다.
{
if (weapon.gameObject.tag.Equals("Monster")) //부딪힌 객체의 태그를 비교해서 적인지 판단합니다.
{ return true; }
else { return false; }
}
//아래 계산을 한번에 하기
private void AttackCalculation()
{
DamageCalculation();
ProjectileSpeedCalculation();
DurationCalculation();
AttackRangeCalculation();
CooldownCalculation();
CalculateNumberOfProjectiles();
}
//데미지 계산
private void DamageCalculation()
{
damage = weapon.GetComponent().Damage * (1 + character.GetComponent().Damage / 100);
}
...
//투사체 수 계산
private void CalculateNumberOfProjectiles()
{
numberOfProjectiles = weapon.GetComponent().NumberOfProjectiles + character.GetComponent().NumberOfProjectiles;
}
//캐릭터의 스탯지정
//예시를 위해 값은 무작위로 넣음
private int damage = 10; //피해량
private int projectileSpeed = 1; //투사체 속도
private int duration = 3; //지속 시간
private int attackRange = 1; //공격범위
private int cooldown = 5; //쿨타임
private int numberOfProjectiles = 1; //투사체 수
//Get,Set함수 자동 구현
public int Damage
{
get { return damage; }
set { damage = value; }
}
//무기의 스탯 지정
//예시를 위해 값은 무작위로 넣음
private int damage = 10; //피해량
private int projectileSpeed = 1; //투사체 속도
private int duration = 3; //지속 시간
private int attackRange = 1; //공격범위
private int cooldown = 5; //쿨타임
private int numberOfProjectiles = 1; //투사체 수
private void Update()
{
transform.position = transform.position + Vector3.right * totalspeed * Time.deltaTime; //투사체 위치 갱신
}
public void Shoot(int speed) //계산된 속도 가져오기
{
totalspeed = speed;
}
//Get,Set함수 자동 구현
public int Damage
{
get { return damage; }
set { damage = value; }
}
public int health = 100; //몬스터 체력
public int Health
{
get { return health; }
set { health = value; }
}
- 무기 콜라이더가 캐릭터와 부딪히지 않게 하기
- 몬스터와 무기 딜 계산
- 무기마다 벡터와 스탯 조정
- 캐릭터마다 스탯 조정
- 무기를 얻을 때마다 "SkillFiringSystem"(스크립트가 적용된 빈 오브젝트)가 등장
- 캐릭터 선택 후 기본 무기와 캐릭터 자동으로 이 스크립트 public변수에 대입
- 스킬을 얻을 때마다 해당 스킬을 대입한“SkillFiringSystem”(빈 오브젝트)이 새로 등장
- 장신구 관련 식 조정
- 투사체 수가 복수일 때 투사체 간의 발사 간격 혹은 차별점