처음에는 애니메이션이 재생되지 않는 줄 알았다
하지만
강의자료에서는
몬스터인 Orc_Shaman의 애니메이션이 잘 재생되며
밑에 총알로 쓰이는 Skull이 잘 생성된다
총알의 생성은
ReaponHandler에서
public class RangeWeaponHandler : WeaponHandler
{
...
protected override void Start()
{
base.Start();
projectileManager = ProjectileManager.Instance;
SetWeaponSpeed(Delay);
}
public override void Attack()
{
base.Attack();
float projectilesAngleSpace = multipleProjectilesAngel;
int numberOfProjectilesPerShot = numberofProjectilesPerShot;
float minAngle = -(numberOfProjectilesPerShot / 2f) * projectilesAngleSpace + 0.5f * multipleProjectilesAngel;
for (int i = 0; i < numberOfProjectilesPerShot; i++)
{
float angle = minAngle + projectilesAngleSpace * i;
float randomSpread = Random.Range(-spread, spread);
angle += randomSpread;
CreateProjectile(Controller.LookDirection, angle);
}
}
private void CreateProjectile(Vector2 _lookDirection, float angle)
{
projectileManager.ShootBullet(
this,
projectileSpawnPosition.position,
RotateVector2(_lookDirection, angle));
}
아래의 메서드를 호출하다가
CreateProjectile의 ShootBullet에서 생성한다
public class ProjectileManager : MonoBehaviour
{
private static ProjectileManager instance;
public static ProjectileManager Instance{get{return instance;}}
[SerializeField] private GameObject[] projectilePrefabs;
private void Awake()
{
instance = this;
}
public void ShootBullet(RangeWeaponHandler rangeWeaponHandler, Vector2 startPostiion, Vector2 direction )
{
/// 실제 원거리 무기가 생성되어야 할 장소
GameObject origin = projectilePrefabs[rangeWeaponHandler.BulletIndex];
GameObject obj = Instantiate(origin,startPostiion,Quaternion.identity);
ProjectileController projectileController = obj.GetComponent<ProjectileController>();
projectileController.Init(direction, rangeWeaponHandler);
}
}
이 부분에서 생성한다
하지만 내가 만든 것은 생성이 되지 않는다
투사체에 만든 애니메이션을 보고 생성이 되는 것이라고 착각했다
아니다.
저 애니메이션은 없어도된다
생성이 안되는거다
이유는
using UnityEngine;
using Random = UnityEngine.Random;
/// <summary>
///
/// </summary>
public class RangeWeaponHandler : WeaponHandler
{
...
protected override void Start()
{
base.Start();
projectileManager = ProjectileManager.Instance;
SetWeaponSpeed(Delay);
}
public override void Attack()
{
base.Attack();
float projectilesAngleSpace = multipleProjectilesAngel;
int numberOfProjectilesPerShot = numberofProjectilesPerShot;
float minAngle = -(numberOfProjectilesPerShot / 2f) * projectilesAngleSpace + 0.5f * multipleProjectilesAngel;
for (int i = 0; i < numberOfProjectilesPerShot; i++)
{
float angle = minAngle + projectilesAngleSpace * i;
float randomSpread = Random.Range(-spread, spread);
angle += randomSpread;
CreateProjectile(Controller.LookDirection, angle);
}
}
private void CreateProjectile(Vector2 _lookDirection, float angle)
{
projectileManager.ShootBullet(
this,
projectileSpawnPosition.position,
RotateVector2(_lookDirection, angle));
}
private static Vector2 RotateVector2(Vector2 v, float degree)
{
return Quaternion.Euler(0, 0, degree) * v;
}
public override void UpgradeBulletSize(float upgrade)
{
// 투사체 크기
bulletSize += upgrade;
}
public override void UpgradeBulletNumber(int upgrade)
{
// 투사체 갯수
numberofProjectilesPerShot += upgrade;
// 투사체 발사 각도 ++점점 넓어짐
multipleProjectilesAngel += upgrade * 2;
}
}
numberOfProjectilesPerShot 가 0이라서 그렇다
ProjectileManager에 분명히 투사체들을 연결하고 실행했는데 어째서 0일까?
WeaponHandler의 [SerializeField] private int numberofProjectilesPerShot; 변수를 확인해보자
강의에서는 해당 변수의 값이 1이지만
내가 만드는 것은 해당 변수의 값이 0이다
이걸 1로 올릴 수 있으면 정상적으로 투사체 생성을 한다는 얘기다
프리팹을 살펴봤는데
강의자료에서는 프리팹 그 자체에 이미 numberofProjectilesPerShot 변수가 1로 되어있었다
그래서 Projectile Prefabs에서 1개를 가져와서 사용하는 거였구나
실행 중에 값을 1로 바꾸어보았더니
생성한다!
강의 부분에서
아래의 multiple projectiles를 3으로 바꾸니까
3개씩 겹쳐서 생성한다
이 부분이 투사체 생성과 확실히 연관있다
ProjectileManager의 ShootBullet에서 생성하고
public void ShootBullet(RangeWeaponHandler rangeWeaponHandler, Vector2 startPostiion, Vector2 direction )
{
/// 실제 원거리 무기가 생성되어야 할 장소
GameObject origin = projectilePrefabs[rangeWeaponHandler.BulletIndex];
GameObject obj = Instantiate(origin,startPostiion,Quaternion.identity);
ProjectileController projectileController = obj.GetComponent<ProjectileController>();
projectileController.Init(direction, rangeWeaponHandler);
}
ProjectileController.Init에서 방향설정을한다
public void Init(Vector2 direction, RangeWeaponHandler weaponHandler)
{
rangeWeaponHandler = weaponHandler;
this.direction = direction;
currentDuration = 0;
transform.localScale = Vector3.one * weaponHandler.BulletSize;
spriteRenderer.color = weaponHandler.ProjectileColor;
transform.right = this.direction;
if (this.direction.x < 0)
pivot.localRotation = Quaternion.Euler(180, 0, 0);
else
pivot.localRotation = Quaternion.Euler(0, 0, 0);
isReady = true;
}
그리고 설정할때 인덱스 설정도 해야한다
Skull은 1번이다
프리팹에 bullet index가 1로 설정되어있다
그래서 따로 지정하지 않아도 skull이 생성된 것
내가 만들고 있는 것은
0번: 일반몬스터 무기
1번: 보스의 파이어볼... 하지만 시간관계상 못쓸거같다. 이 애니메이션을 만들수가없다
2번: 보스의 아이스볼. 이것만큼은 꼭 써보자
일반몬스터니까 0번에 놓고
이런저런 설정을 하고
특히 bullet index 잘맞추고
나머지 숫자도 0이 되지 않게 만드니
드디어 투사체가 생성되었다
이제 보스몬스터도 투사체는 해결이 가능할듯 해서 보니까
나온다
하지만 phase 1일떄에도 나오는 문제가 있어서
이제 phase 2에만 나오게 만들면 될 것 같다
그 외 나머지는 근접공격이니까 다른 방식(아마도 collider 충돌을 이용한 trigger와 몬스터 자체의 animation)을 적용하면 될 것 같다
'유니티 부트캠프 8기 > Ch04. Unity 게임 개발 입문' 카테고리의 다른 글
유니티에서 Newtonsoft json을 사용한 직렬화, 역직렬화 (0) | 2025.02.26 |
---|---|
몬스터의 애니메이션(Blend Tree) (0) | 2025.02.25 |
ECS에서 Normal몬스터와 Boss몬스터의 이동은 같은 Entity를 사용해야할까? (0) | 2025.02.24 |
Monster의 구조 설계(Entity Component System) (0) | 2025.02.24 |
유니티 팀프로젝트 시작 (0) | 2025.02.22 |