-샘플무기 추가
-샘플무기 변경
-샘플무기 발사
https://steamcommunity.com/sharedfiles/filedetails/?id=1629158033
샘플로 사용할 이미지를 가져왔지만 써도되는지 모르지만 그냥 썻다
먼저 무기를 추가하기위한 무기데이터를 만들어줍시다
[CreateAssetMenu(fileName ="MonsterData ", menuName ="Pakuri/New Monster Data", order =2)]
public class MonsterData : ScriptableObject
{
public string m_name = string.Empty;
public GameObject m_obj = null;
public float m_speed = 0.0f;
public Vector2Int m_damage = Vector2Int.zero;
public float IsDamage
{
get
{
return Random.Range(m_damage.x, m_damage.y + 1);
}
}
}
에셋메뉴를 추가해주었습니다
위 사진과 같이 생성한 변수를 바탕으로 데이터를 입력할 수 있지
public class GManager : MonoBehaviour
{
public List<WeaponData> m_weaponList = null;
Dictionary<string, WeaponData> m_weaponDic = null;
public static GManager Instance
{
get
{
return g_instance;
}
}
private void Awake()
{
if (GManager.Instance == null)
{
g_instance = this;
WeaponSetting();
DontDestroyOnLoad(gameObject);
}
else
{
Destroy(gameObject);
}
}
void WeaponSetting()
{
m_weaponDic = new Dictionary<string, WeaponData>();
for (int i=0; i<m_weaponList.Count; i++)
{
m_weaponDic.Add(m_weaponList[i].m_weaponName, m_weaponList[i]);
}
m_weaponList.Clear();
}
/// <summary>
/// 오브젝트 생성 배치
/// </summary>
/// <param name="argObj">생성할 오브젝트</param>
/// <param name="argParentT">부모 오브젝트</param>
/// <param name="argParentFlag">참: 부모관계형성 거짓: 이미 부모관계</param>
/// <returns>생성된 오브젝트</returns>
public GameObject CreatObj(GameObject argObj, Transform argParentT, bool argParentFlag = true)
{
GameObject _obj = null;
switch (argParentFlag)
{
case true:
_obj = Instantiate(argObj, argParentT);
_obj.transform.localPosition = Vector3.zero;
_obj.transform.localRotation = Quaternion.identity;
_obj.name = "ViewObj";
break;
case false:
_obj = Instantiate(argObj);
_obj.transform.localPosition = argParentT.position;
_obj.transform.localRotation = argParentT.rotation;
_obj.name = "ViewObj";
break;
}
return _obj;
}
/// <summary>
/// 무기 반환
/// </summary>
/// <param name="argStr">무기 이름</param>
/// <returns>무기 데이터</returns>
public WeaponData GetWeaponData(string argStr)
{
return m_weaponDic.ContainsKey(argStr) ? m_weaponDic[argStr] : null;
}
}
CreatObj :
오브젝트를 생성해줍니다. 무기뿐만 아닌 다양한 곳에서 사용될 것입니다.
WeaponSetting:
무기데이터의 이름값을 키값으로 사용하는 딕셔너리를 생성하고 초기화 해줬습니다
GetWeaponData:
무기데이터를 반환해줍니다
무기에 빈 오브젝트를 추가해줬습니다. 총알이 발사될 위치가 될것이야
위의 무기는 샷건이기에 총알이 발사될 위치를 5개로 설정해주었습니다.
public class Weapon : MonoBehaviour
{
/// <summary>
/// 총알발사 베이스 트랜스폼
/// </summary>
public Transform[] m_sBaseT = null;
/// <summary>
/// 스프라이트 렌더러
/// </summary>
public SpriteRenderer m_spRenderer = null;
void Start()
{
}
private void LateUpdate()
{
Vector2 _pos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
m_spRenderer.flipY = transform.position.x < _pos.x ? false : true;
}
}
무기에 들어갈 스크립트
public class Bullet : MonoBehaviour
{
public float m_speed = 0.0f;
public bool m_nonCallFlag = false;
Vector2 m_startPos = Vector2.zero;
float m_atkLength = 0.0f;
public void bulletTimeSetting(float argAtkLength)
{
m_startPos = transform.position;
m_atkLength = argAtkLength;
Destroy(gameObject, 4.0f);
}
// Update is called once per frame
void Update()
{
transform.Translate(m_speed * Time.deltaTime * Vector2.right);
if(!GManager.Instance.CheckLength(m_startPos, transform.position, m_atkLength))
{
Destroy(gameObject);
}
}
}
총알 스크립트
적당한 이미지를 구하고 스크립트 부착후 prefab으로 만들어주었습니다
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
public WeaponType.Type m_weaponType = WeaponType.Type.Rifle;
public float m_speed = 0.0f;
Transform m_weaponBase = null;
string m_weaponName = string.Empty;
GameObject m_viewObj = null;
GameObject m_weaponObj = null;
WeaponData m_wData = null;
List<Transform> m_shotBaseT = new List<Transform>();
bool m_atkFlag = false;
void Start()
{
startSetting();
}
void startSetting()
{
m_weaponBase = transform.Find("WeaponBase");
WeaponList();
LoadWeapon(m_weaponName);
}
// Update is called once per frame
void Update()
{
AttackController();
}
void WeaponList()
{
switch (m_weaponType)
{
case WeaponType.Type.Rifle:
m_weaponName = "Rifle";
break;
case WeaponType.Type.Carbin:
m_weaponName = "Carbin";
break;
case WeaponType.Type.LMG:
m_weaponName = "LMG";
break;
case WeaponType.Type.Shotgun:
m_weaponName = "Shotgun";
break;
}
}
void LoadWeapon(string argName)
{
if(m_weaponObj !=null)
{
m_wData = null;
m_shotBaseT.Clear();
Destroy(m_weaponObj);
}
m_wData = GManager.Instance.GetWeaponData(argName);
//Debug.Log("생");
if (m_wData == null) return;
m_weaponObj = GManager.Instance.CreatObj(m_wData.m_weaponObj, m_weaponBase);
//Debug.Log("성");
Weapon _weaponBaseSc = m_weaponObj.GetComponent<Weapon>();
for(int i = 0; i< _weaponBaseSc.m_sBaseT.Length; i++)
{
m_shotBaseT.Add(_weaponBaseSc.m_sBaseT[i]);
}
}
void AttackController()
{
if (m_atkFlag) return;
if(Input.GetAxis("Fire1") > 0.0f)
{
m_atkFlag = true;
for(int i=0; i<m_shotBaseT.Count; i++)
{
Quaternion _rot = m_shotBaseT[i].localRotation;
m_shotBaseT[i].Rotate(0.0f, 0.0f, Random.Range(-m_wData.m_dispersionAngle, m_wData.m_dispersionAngle));
GameObject _bulletObj = GManager.Instance.CreatObj(m_wData.m_bulletObj, m_shotBaseT[i], false);
_bulletObj.GetComponent<Bullet>().bulletTimeSetting(m_wData.m_atkLength);
m_shotBaseT[i].localRotation = _rot;
}
Invoke("ClearAtk", m_wData.m_reAtkTime);
}
}
void ClearAtk()
{
m_atkFlag = false;
}
}
테스트 과정중 무기 선택을 쉽게하기 위해서 열거형 타입변수 추가해주고
WeaponList로 선택할 수 있게 만들어주었습니다
Loadweapon:
선택한 무기데이터를 불러오고 그에 맞는 오브젝트를 생성해줍니다
AttackController
무기발사를 위한 것입니다. m_dispersionAngle은 흔들림 각도입니다.
값이 높을수록 "탄퍼짐"이 심해집니다
======결과물=======
'파쿠리프로젝트' 카테고리의 다른 글
파쿠리 프로젝트(1) (0) | 2022.12.28 |
---|---|
파쿠리 프로젝트(0) (0) | 2022.12.28 |