728x90
1. 개발 현황
1. 원거리 폭발형 무기 구현 완료
2. 게임 시작 & 종료 HUD 및 제어로직 추가 완료
3. 업적 시스템 구현 완료
2. 금일 개발 내용
1. 거미줄 무기 추가
1) 스프라이트 추가 (Atlas Sprite)
- 스프라이트 자료 경로: https://www.klipartz.com/ko/sticker-png-bxswr
2) 투사체 크기 제어 로직 추가
void FireWeb()
{
if (!GameManager.instance.mPlayer.mScanner.mNearestTarget)
return;
Vector3 targetPos = GameManager.instance.mPlayer.mScanner.mNearestTarget.position;
Vector3 rootDir = targetPos - GameManager.instance.mPlayer.transform.position;
rootDir = rootDir.normalized;
// 방사형 공격 로직
for (int i = 0; i < GameManager.instance.mWeaponLastData[mId].Projectile; ++i)
{
Vector3 dir = rootDir;
if (GameManager.instance.mWeaponLastData[mId].Projectile != 1)
{
float rot = 30 * (i / ((float)GameManager.instance.mWeaponLastData[mId].Projectile - 1)) - 15;
dir = Quaternion.Euler(0, 0, rot) * dir;
}
Transform bullet = mWeaponPool.Get().transform;
bullet.parent = mWeaponPool.transform;
bullet.position = GameManager.instance.mPlayer.transform.position;
bullet.rotation = Quaternion.FromToRotation(Vector3.up, dir);
bullet.localScale = new Vector3(0.02f, 0.4f, 1f); // 투사체 크기 제어
bullet.GetComponent<Range>().Init(Mathf.RoundToInt(GameManager.instance.mWeaponLastData[mId].Damage), GameManager.instance.mWeaponLastData[mId].Pierce, dir, GameManager.instance.mWeaponLastData[mId].Speed); // -1 is Infinity Per
}
}
3) 디버프 로직 추가
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.CompareTag("Garlic"))
{
mIsGarlic = true;
mGarlicDamage = collision.GetComponent<Melee>().mDamage;
return;
}
if (collision.CompareTag("SpiderWeb"))
{
mMovementSpeedCoef *= 0.5f;
collision.GetComponent<Range>().transform.localScale = new Vector3(1.0f, 1.0f, 1.0f); // 투사체 범위 제어
collision.GetComponent<Range>().mSpeed = 0f;
}
}
private void OnTriggerExit2D(Collider2D collision)
{
if (collision.CompareTag("Garlic"))
mIsGarlic = false;
if (collision.CompareTag("SpiderWeb"))
mMovementSpeedCoef = 2f;
}
2. 게임 시작 및 종료 HUD 추가
1-1) 캐릭터 선택 HUD 제작
1-2) HUD 자동생성 로직 추가
- RootHUD 기반, 캐릭터 선택 버튼 복제
public class HUDGameStart : MonoBehaviour
{
RectTransform mRect;
public GameObject mRootHUD;
GameObject[] mPlayers;
void Awake()
{
mRect = GetComponent<RectTransform>();
mPlayers = new GameObject[GameManager.instance.mPlayerJsonData.Length];
mPlayers[0] = mRootHUD;
mPlayers[0].GetComponent<HUDBtnPlayer>().mId = 0;
mPlayers[0].GetComponent<HUDBtnPlayer>().Init();
for (int i = 1; i < mPlayers.Length; ++i)
{
mPlayers[i] = Instantiate(mRootHUD);
mPlayers[i].transform.SetParent(mRootHUD.transform.parent);
mPlayers[i].transform.name = "Character " + i;
mPlayers[i].transform.localScale = mRootHUD.transform.localScale;
mPlayers[i].GetComponent<HUDBtnPlayer>().mId = i;
mPlayers[i].GetComponent<HUDBtnPlayer>().Init();
mPlayers[i].GetComponent<Button>().interactable = true;
if (!GameManager.instance.mPlayerJsonData[i].Enable)
mPlayers[i].GetComponent<Button>().interactable = false;
}
}
}
- 텍스트 및 스프라이트 초기화
- 버튼 클릭 시 게임 시작
public class HUDBtnPlayer : MonoBehaviour
{
public int mId;
Image mImgBackground;
Image mImgChar;
TMP_Text mTextName;
TMP_Text mTextDesc;
private void Awake()
{
Image[] imgs = GetComponentsInChildren<Image>();
TMP_Text[] texts = GetComponentsInChildren<TMP_Text>();
mImgBackground = imgs[0];
mImgChar = imgs[1];
mTextName = texts[0];
mTextDesc = texts[1];
}
public void Init()
{
mImgChar.sprite = GameManager.instance.mPlayerSprite[mId];
mTextName.text = GameManager.instance.mPlayerJsonData[mId].Name;
mTextDesc.text = GameManager.instance.mPlayerJsonData[mId].Desc;
if (!GameManager.instance.mPlayerJsonData[mId].Enable)
{
mTextName.text = "Unlocked";
mTextDesc.text = GameManager.instance.mPlayerJsonData[mId].UnlockDesc;
mImgBackground.color = new Color(150, 150, 150);
mImgChar.color = new Color(0, 0, 0);
}
}
public void OnClick()
{
GameManager.instance.GameStart(mId);
}
}
2-1) 게임 종료 HUD 추가
2-2) HUD 관리 로직 추가
public class HUDResult : MonoBehaviour
{
public GameObject[] mTitle;
public void Lose()
{
mTitle[0].SetActive(true);
mTitle[1].SetActive(false);
}
public void Win()
{
mTitle[0].SetActive(false);
mTitle[1].SetActive(true);
}
}
public class GameManager : MonoBehaviour
{
public static GameManager instance;
// 생략
public HUDResult mHUDResult;
public WaitForSeconds mWait0_5s;
IEnumerator GameOverRoutine()
{
mIsLive = false;
yield return mWait0_5s;
mHUDResult.Lose();
mHUDResult.gameObject.SetActive(true);
Stop();
}
IEnumerator GameVictoryRoutine()
{
mIsLive = false;
for (int i = 0; i < mEnemyPool.mPool.Count; ++i)
mEnemyPool.mPool[i].SetActive(false);
yield return mWait0_5s;
mHUDResult.Win();
mHUDResult.gameObject.SetActive(true);
Stop();
}
public void GameOver()
{
StartCoroutine(GameOverRoutine());
}
public void GameVictory()
{
StartCoroutine(GameVictoryRoutine());
}
}
3. 업적 시스템 추가
1) HUD 추가
2) HUD 자동화 시스템
public void InitAchive()
{
PlayerPrefs.SetInt("MyData", 1);
for (int i = 0; i < mAchiveJsonData.Length; ++i)
{
PlayerPrefs.SetInt(mAchiveJsonData[i].Name.ToString(), 0);
}
}
void CheckAchive()
{
for (int i= 0; i< mAchiveJsonData.Length; ++i)
{
bool isAchive = false;
switch (mAchiveJsonData[i].Name)
{
case Enum.Achive.UnlockChar2:
if (mPlayerData.Kill >= 1) isAchive = true;
break;
case Enum.Achive.UnlockChar3:
if (mPlayerData.GameTime >= 300) isAchive = true;
break;
default:
Debug.Assert(false, "Error");
break;
}
if (isAchive && PlayerPrefs.GetInt(mAchiveJsonData[i].Name.ToString()) == 0)
{
PlayerPrefs.SetInt(mAchiveJsonData[i].Name.ToString(), 1);
StartCoroutine(NoticeRoutine(i));
}
}
}
IEnumerator NoticeRoutine(int i)
{
mHUDAchive.gameObject.SetActive(true);
mHUDAchive.mIcon.sprite = mAchiveSprite[mAchiveJsonData[i].SpriteId];
mHUDAchive.mText.text = mAchiveJsonData[i].Desc;
yield return mWait5s;
mHUDAchive.gameObject.SetActive(false);
}
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
public class HUDAchive : MonoBehaviour
{
public Image mIcon;
public TMP_Text mText;
private void Awake()
{
mIcon = GetComponentsInChildren<Image>()[1];
mText = GetComponentsInChildren<TMP_Text>()[0];
}
}
3. TODO
1. 골드 및 경험치 드롭 구현
2. 필드 장애물 구현
3. 필드 드롭 아이템 구현
4. 필드 이벤트 구현
5. 이펙트 구현
6. 사운드 구현
'--------게임만들기-------- > |unity| by C#' 카테고리의 다른 글
[Unity] Day9 - 다국어 지원, 볼륨 제어 (Dropdown, Slider, Toggle) (0) | 2024.06.09 |
---|---|
[Unity] Day8 - 무기 프리팹 일원화, 아이템 드롭, 픽업, 오디오, 세팅창 구현, 스크린 제어(TMP_Dropdown, Toggle, 스크립트 제어) (0) | 2024.06.09 |
[Unity] Day6 - 도끼, 마늘 무기 구현 (0) | 2024.06.07 |
[Unity] Day5 - 단검 무기 구현, 버그 개선 (position, localPosition) (0) | 2024.06.06 |
[Unity] localPosition, position (0) | 2024.06.05 |