[패스트캠퍼스 수강 후기] 올인원 패키지 : 유니티 포트폴리오 완성 100% 환급 챌린지 46회차 미션 시작합니다.
04. 배틀로얄 - 37, 38 번을 진행합니다.
생명력 컴퍼넌트와 경고 체크 컴포넌트 개발을 시작합니다.
위와 같이 Manager 폴더를 하나 만들고, DataManager, SoundManager, EffectManager를 만든 후에 각각의 Manager Script를 드래그하여 연결시켜 줍니다.
설정을 잘 확인후에 Unity 플레이를 진행해 봅니다. 무기 근처에 가니 "Pick Rifle" 글자가 잘 나오긴 하는데 Console을 보니 에러가 발생하고 있습니다.
GetKeyDown() -> GetButtonDown()으로 변경해주어야 합니다.
다시 Unity 플레이를 하여 무기를 집어봅니다...
그런데 총 모양이 다르네요 ^^; 아직 버그인건지 설정 문제인지는 모르는 상황.. ㅎㅎ
Weapon Sprite에서 "rifle_HUD"로 설정해주어서 해결됩니다.
바닥의 총이 사라지고 캐릭터가 집지 않은 건 아직 ShootBehaviour를 작성하지 않았기 때문입니다.
해당 위치에 HealthBase 스크립트를 생성하여 줍니다. 그리고 코드 작업을 시작합니다.
pubic class HealthBase : MonoBehaviour
{
public class DamageInfo {
public Vector3 location, direction; // 맞은 위치와 방향
public float damage;
public Collider bodyPart;
public GameObject origin;
public DamageInfo(Vector3 location, Vector3 direction, float damage, Collider bodyPart = null, GameObject origin = null) {
this.location = location;
this.direction = direction;
this.damage = damage;
this.bodyPart = bodyPart;
this.origin = origin;
}
}
[HideInInspector] public bool IsDead;
protected Animator myAnimator;
public virtual void TakeDamage(Vector3 location, Vector3 direction, float damage, Collider bodyPart = null, GameObject origin = null) {
}
public void HitCallBack(DamageInfo damageInfo) {
TakeDamage(damageInfo.location, damageInfo.direction, damageInfo.damage, damageInfo.bodyPart, damageInfo..origin);
}
}
TagAndLayer 스크립트에 LayerMasking 클래스를 하나 작성해 줍니다. 코딩 편의를 위하여 ㅎㅎ..
AlertChecker 스크립트를 생성하고 작성을 시작합니다.
public class AlertChecker : MonoBehaviour
{
[Range(0,50)] public float alertRadius;
public int extraWaves = 1;
public LayerMask alertmask = TagAndLayer.LayerMasking.Enemy;
private Vector3 current;
private bool alert;
private void Start() {
InvokeRepeating("PingAlert", 1, 1);
}
private void AlertNearBy(Vector3 origin, Vector3 target, int wave = 0) {
if (wave > extraWaves) return;
Collider[] targetsInViewRadius = Physics.OverlapSphere(origin, alertRadius, alertMask);
foreach (Collider obj in targetsInViewRadius) {
obj.SendMessageUpwards("AlertCallback", target, SendMessageOptions.DontRequireReceive);
AlertNearBy(obj.transform.position, target, wave + 1);
}
}
public void RootAlertNewBy(Vector3 origin) {
current = origin;
alert = true;
}
void PingAlert() {
if (alert) {
alert = false;
AlertNearBy(current, current);
}
}
}
사격 동작 만들기 시작입니다. 대략 500 라인 정도된다고 합니다.
/// <summary>
/// 사격 기능 : 사격이 가능한지 여부를 체크하는 기능
/// 발사 키 입력받아서 애니메이션 재생, 이펙트 생성, 충돌 체크 기능
/// UI 관련해서 십자선 표시 기능
/// 발사 속도 조정
/// 캐릭터 상체를 IK를 이용해서 조준 시점에 맞춰 회전.
/// 벽이나 충돌체 총알이 피격되었을 경우 피탄 이팩트를 생성하고
/// 인벤토리 역할. 무기를 소지하고 있는지 확인용
/// 재장전과 무기 교체 기능까지 포함하고 있음.
/// </summary>
public class ShootBehaviour : GenericBehaviour
{
public Texture2D aimCrossHair, shootCrossHair;
public GameObject muzzleFlash, shot, sparks;
public Material bulletHole;
public int MaxBulletHoles = 50;
public float shootErrorRate = 0.01f;
public float shootRateFactor = 1f;
pubic float armsRotation = 8f;
public LayerMask shotMask = ~(TagAndLayer.LayerMasking.IgnoreRayCast | TagAndLayer.LayerMasking.IgnoreShot | TagAndLayer.LayerMasking..ConvertInvisible | TagAndLayer.LayerMasking.Player);
public LayerMask organicMask = TagAndLayer.LayerMasking.Player | TagAndLayer.LayerMasking.Enemy;
// 짧은총, 피스톨 같은 총을 들었을 때 조준시 왼팔의 위치 보정.
public Vector3 leftArmShortAim = new Vector3(-4.0f, 0.0f, 2.0f);
private int activeWeapon = 0;
// animator value
private int weaponType;
private int changeWeaponTrigger;
private int shootingTrigger;
private int aimBool, blockedAimBool, reloadBool;
private List<InteractiveWeapon> weapons; /// 소지하고 있는 무기들.
private bool isAiming, isAimBlocked;
private Transform gunMuzzle;
private float distToHand;
private Vector3 castRelativeOrigin;
private Dictionary<InteractiveWeapon.WeaponType, int> slotMap;
private Transform hips, spine, chest, rightHand, leftArm;
private Vector3 initialRootRotation;
private Vector3 initialHipsRotation;
private Vector3 initialSpineRotation;
private Vector3 initialCheckRotation;
private float shotInterval, originalShotInterval = 0.5f;
private List<GameObject> bulletHoles;
private int bulletHoleSlot = 0;
private int brustShotCount = 0;
private AimBehaviour aimBehaviour;
private Texture2D originalCrossHair;
private bool isShooting = false;
private bool isChangingWeapon = false;
private bool isShotAlive = false;
void Start() {} // 각 변수들의 초기화............ Vomiting........
}
<위의 코드들은 제가 보면서 주요한 함수, 코드를 확인하기 위해 타이핑한 용도로, 전체 소스코드가 아님에 주의해 주세요. 전체 코드는 교육 수강을 하면 완벽하게 받으실 수가 있답니다 ^^>
패스트캠퍼스 - 올인원 패키지 : 유니티 포트폴리오 완성 bit.ly/2R561g0
'[컴퓨터] > 웹 | 앱 | 게임 개발' 카테고리의 다른 글
[패스트캠퍼스 수강 후기] 올인원 패키지 : 유니티 포트폴리오 완성 100% 환급 챌린지 48회차 미션 (0) | 2020.12.05 |
---|---|
[패스트캠퍼스 수강 후기] 올인원 패키지 : 유니티 포트폴리오 완성 100% 환급 챌린지 47회차 미션 (0) | 2020.12.04 |
[패스트캠퍼스 수강 후기] 올인원 패키지 : 유니티 포트폴리오 완성 100% 환급 챌린지 45회차 미션 (0) | 2020.12.02 |
[패스트캠퍼스 수강 후기] 올인원 패키지 : 유니티 포트폴리오 완성 100% 환급 챌린지 44회차 미션 (0) | 2020.12.01 |
[패스트캠퍼스 수강 후기] 올인원 패키지 : 유니티 포트폴리오 완성 100% 환급 챌린지 43회차 미션 (0) | 2020.11.30 |