-샘플무기 추가

-샘플무기 변경

-샘플무기 발사

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

+ Recent posts