2020년 8월 12일 수요일

[Unity] EventArgs 사용 예제

 이벤트 헨들러  사용예


FCE_JOB은 하나
FCE_INFO는 FCE  전부 붙어있음

FCE_JOB 에서 소재 생성을 하는 이벤트 만듬


public static EventHandler<CreateSlabEventArgsCreateSlabEventHandler//소재생성
CreateSlabEventHandler += OnFCECreateSlabEvent;


///역할은 그냥 단순히 slabNO을 받아서 웹소켓 요청
public void OnFCECreateSlabEvent(object senderCreateSlabEventArgs eventArgs)
    {
        //사이즈 데이터 요청..
        WebSocket.r_FCESlabSizeData(eventArgs.slabNo);
    }

FCE_INFO 에서는
이런식으로 사용



FCE_JOB.CreateSlabEventHandler(thisnew CreateSlabEventArgs() { fceNo = si.Fce_NoslabNo = si.Slab_No });





using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
using System;

//SLAB소재에 대한 클래스
//디스플레이할 다른데이터도 추가 해야함
//아니면 따로 빼야하나??일단 보류





/// <summary>
/// 슬라브 생성 이벤트
/// 1. 형상화 정보 요청
/// 2. UI 표현? (일단 추가 안함)
/// </summary>
public class CreateSlabEventArgs : EventArgs
{
    public string slabNo;
    public int fceNo;
}


/// <summary>
/// 사이즈 데이터 전송 이벤트
/// 1.개별 FCE_NO에 따라 데이터 전송
/// </summary>
public class SizeEventArgs : EventArgs
{
    public TBL_FUR_SLAB_INF slabData;
}



/// <summary>
/// 트레킹정보 이벤트
/// 1.개별 FCE_NO에 따라 데이터 전송
/// </summary>
public class TRKEventArgs : EventArgs
{
    public TBL_FUR_SLAB_TRK slabTRKData;
}




public class FCE_JOB : MonoBehaviour {


    public static EventHandler<CreateSlabEventArgsCreateSlabEventHandler//소재생성


    public static EventHandler<SizeEventArgsSizeEvnetHandler//사이즈데이터
    public static EventHandler<TRKEventArgsTRKEventHandler//트레킹데이터

    
    
    //동작 로직의 순서는
    //1. 위치이동
    //2. 추출,장입
    //public delegate SLABDATA[] GetFceSlabDatas(SLABDATA[] datas);
    //public GetFceSlabDatas del_GetFceSlabDatas;

    public FCE_INFO[] fce_Infos;
    public TBL_FUR_SLAB_INF slabSizeData;
    //public SLABDATA c_LastData;//트레킹 데이터와 마지막 데이터 비교
    //public SLABDATA c_FirstData;

    IEnumerator cor_DataUpdate;

    //추출
    //TB_TRK 에 올라온 코일ID기반으로 SLAB번호 추적하여 비교


    //장입
    //slab01에 데이터가 처음 들어왔을때 & CS의 slab01데이터가 다를때


    //위치이동(순간이동,로직이동)
    //업데이트 주기마다 위치값 비교하여 로직이동
    //장입시 로직이 완료된 다음 위치 순간이동

    

    int checkTime = 1;//데이터업데이트 주기용

    private void Start()
    {

        //Screen.SetResolution(1920, 1080, true);

        StartDataUpdate();

        CreateSlabEventHandler += OnFCECreateSlabEvent;
        SizeEvnetHandler += OnFCESizeEvent;
        TRKEventHandler += OnFCETRKEvent;
        
    }

    public void OnFCECreateSlabEvent(object senderCreateSlabEventArgs eventArgs)
    {
        //사이즈 데이터 요청..
        WebSocket.r_FCESlabSizeData(eventArgs.slabNo);
    }

    public void OnFCESizeEvent(object senderSizeEventArgs items)
    {
        if (items.slabData._TBL_FUR_SLAB_INF_ITEM == null)
        {
            //Debug.Log("형상화 데이터가 없습니다");
            return;
        }

        for (int i = 0i < fce_Infos.Lengthi++)
        {

            if (fce_Infos[i].fce_No == items.slabData._TBL_FUR_SLAB_INF_ITEM.FCE_NO)
            {
                fce_Infos[i].mySizeInfo.Enqueue(items.slabData._TBL_FUR_SLAB_INF_ITEM);
            }
        }

    }


    public void OnFCETRKEvent(object senderTRKEventArgs eventArgs)
    {

        //Debug.Log("갯수 : " + eventArgs.slabTRKData._TBL_FUR_SLAB_TRK_ITEM.Length);

        //if (eventArgs.slabTRKData._TBL_FUR_SLAB_TRK_ITEM.Count() != 4)
        //{
        //    Debug.Log("받아온데이터가 이상하다");
        //    return;
        //}

        //Debug.Log("count:" + eventArgs.slabTRKData._TBL_FUR_SLAB_TRK_ITEM.Count());
        foreach (var x in eventArgs.slabTRKData._TBL_FUR_SLAB_TRK_ITEM)
        {
            fce_Infos[x.FCE_NO - 1].DataBinding(x);
        }


        //for (int i = 0; i < fce_Infos.Length; i++)
        //{
        //    fce_Infos[i].DataBinding(eventArgs.slabTRKData._TBL_FUR_SLAB_TRK_ITEM[i].fc);
        //}
    }

   
    public void StartDataUpdate()
    {

        if (cor_DataUpdate != null)
        {
            StopCoroutine(cor_DataUpdate);
            cor_DataUpdate = null;
        }
        cor_DataUpdate = DataUpdate();
        StartCoroutine(cor_DataUpdate);
    }


    private void Update()
    {
        //업데이트에서 돌리기 
        if (WebSocket.cue_TBL_FUR_SLAB_INF.Count != 0)
        {
            SizeEvnetHandler(thisnew SizeEventArgs() { slabData = WebSocket.cue_TBL_FUR_SLAB_INF.Dequeue()});
        }
    }

    public IEnumerator DataUpdate()
    {
        while (true)
        {
            if (WebSocket.cue_TBL_FUR_SLAB_TRKs.Count != 0)
            {
                TRKEventHandler(thisnew TRKEventArgs() { slabTRKData = WebSocket.cue_TBL_FUR_SLAB_TRKs.Dequeue() });
                //더 간단하게 만들어보기
                if (checkTime != 5)
                    checkTime = 5;
            }

            yield return new WaitForSeconds(checkTime);

            //Debug.Log("FCE DataUpdate!!! 현재 주기:"+checkTime+"초");
        }
    }




}



##################################################
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.Linq;
using System;







public class FCE_INFO : MonoBehaviour
{
    
    public float CreateOffset//처음 생성할때 위치 잡아주는 변수
    public Text txt_State;
    public Text txt_SlabNo;
    public Image Img_state;

    [Space]
    public furnaceTracking m_furnaceTracking;
    public SearchManager m_SearchManager;
    public int fce_No;
    public GameObject prefab_slab;
    public Transform Fce_Start_Init_Pos;
    public Transform CharePos;

    public List<SlabInfocurrent_FceSlabDatas = new List<SlabInfo>(); //실제로 만들 prefab에 붙어있는 데이터
    public Queue<TBL_FUR_SLAB_INF_ITEMmySizeInfo = new Queue<TBL_FUR_SLAB_INF_ITEM>();
    int moveDistance = 0;


    IEnumerator cor_Extract;
    IEnumerator cor_Charge;
    IEnumerator cor_Move;


    bool isChargeing;

    public static EventHandler<SlabDataEventArgsSlabDataEventHandler;
    public class SlabDataEventArgs : EventArgs
    {
        public TBL_FUR_SLAB_INF_ITEM slabData;
    }



    public void Start()
    {
        SlabDataEventHandler += OnSizeDataBinding;
        SlabDataEventHandler += OnSizeDataShaping;
        isChargeing = false;
        
        //CreateOffset = 0.001f; //mm단위로 계산하면 정답은 100이 맞긴함 하지만 조금더 간격이 벌어졋으면 좋겠다고 하셧음
        CreateOffset = 0.001f//mm단위로 계산하면 정답은 100이 맞긴함
    }

    private void Update()
    {
        if (mySizeInfo.Count != 0)
        {
            SlabDataEventHandler(thisnew SlabDataEventArgs() { slabData = mySizeInfo.Dequeue() });
        }
        #region 테스트
        //if (Input.GetKeyDown("1"))
        //{
        //    LogManager.del_eventLog("Slab 장입 신호 : " + "SB76932 531");
        //}

        //if (Input.GetKeyDown("2"))
        //{
        //    LogManager.del_eventLog("Slab 장입 : " + "SB76932 531");
        //}

        //if (fce_No == 1 )
        //{
        //    if (Input.GetKeyDown("1"))
        //    {
        //        StartCoroutine(TEST(1));
        //    }

        //    if (Input.GetKeyDown("2"))
        //    {
        //        StartCoroutine(TEST(2));
        //    }
        //    if (Input.GetKeyDown("3"))
        //    {
        //        StartCoroutine(TEST(3));
        //    }
        //    if (Input.GetKeyDown("4"))
        //    {
        //        StartCoroutine(TEST(4));
        //    }
        //    if (Input.GetKeyDown("5"))
        //    {
        //        StartCoroutine(TEST(5));
        //    }
        //    if (Input.GetKeyDown("6"))
        //    {
        //        StartCoroutine(TEST(6));
        //    }
        //    if (Input.GetKeyDown("7"))
        //    {
        //        StartCoroutine(TEST(7));
        //    }
        //}
        #endregion
    }

    //IEnumerator TEST(int i)
    //{
    //    LogManager.del_eventLog("Down Coiler 동작 신호" + "CoilID_28700");
    //    yield return new WaitForSeconds(0.01f);
    //    LogManager.del_eventLog("Down Coiler 동작" + "CoilID_28700");
    //}


    public void OneCylcleMove(float sPos,float ePos)
    {
        m_furnaceTracking.func_Slab_Set_Position(sPosePos);
    }

    public void OnSizeDataBinding(object senderSlabDataEventArgs eventArgs)
    {

        if (!current_FceSlabDatas.Exists(x => x.Slab_No == eventArgs.slabData.SLAB_NO))
        {
            //Debug.Log(this.gameObject.name + "해당 소재번호에 대한 정보가 존재하지 않음 :" + eventArgs.slabData.SLAB_NO);
            return;
        }

        SlabInfo cur_tmp = current_FceSlabDatas.Find(x => x.Slab_No == eventArgs.slabData.SLAB_NO);

        float offset = 0.001f;

        cur_tmp.Wth = eventArgs.slabData.SLAB_WID*0.1f;
        cur_tmp.Len = eventArgs.slabData.SLAB_LEN;
        cur_tmp.Thk = eventArgs.slabData.SLAB_THK*0.001f;
        cur_tmp.TGT = eventArgs.slabData.SLAB_T_TGT;

        
        //x len,y thk,z wth
        //너무 정두깨로 만들면 겹치는 사태 발생
        //가열로 내 소재 크기 
        cur_tmp.gameObject.transform.localScale = new Vector3(cur_tmp.Len * offsetcur_tmp.Thk * offsetcur_tmp.Wth * offset*0.9f);

        //가열로 내 소재 색깔
        //r 0.5
        //시작 g 0.26
        float colorValue = cur_tmp.Pos / 100;
        Renderer renderer = cur_tmp.transform.GetChild(0).GetComponent<Renderer>();
        if (cur_tmp.Pos < 24000)
        {
            renderer.material.SetColor("_Color"new Color(0.24f + (colorValue) * 0.001f0.1f0));
        }
        else
        {
            renderer.material.SetColor("_Color"new Color(0.24f + (colorValue) * 0.0015f0.1f0));
        }

        
        
        
    }

    public void OnSizeDataShaping(object senderSlabDataEventArgs eventArgs)
    {
        SlabInfo cur_tmp = current_FceSlabDatas.Find(x => x.Slab_No == eventArgs.slabData.SLAB_NO);
        //Debug.Log("shaping 테스트!!!");
        //cur_tmp.gameObject.transform.localScale = new Vector3()

    }




    /// <summary>
    /// 추출
    /// </summary>
    /// /// <param name="data">추출할 소재 데이터</param>
    IEnumerator extractLogic(SlabInfo extractItem)
    {
        LogManager.del_eventLog("Slab 추출 : " + extractItem.Slab_No);
        State_Extract();
        
        //Debug.Log("Slab 추출 : " + extractItem.Slab_No);

        m_furnaceTracking.func_ExitLogic(extractItem.name, -8f);
        yield return new WaitForSeconds(5f);//5초 기다리는 이유가 있나?

        if (extractItem != null)
        {
            //Debug.Log("추출끝!!:" + extractItem.gameObject.name);

            m_SearchManager.Delete_btn(extractItem.Slab_Nofce_No - 1);
            int deleteIdx = current_FceSlabDatas.IndexOf(extractItem);
            Destroy(extractItem.gameObject);
            current_FceSlabDatas.RemoveAt(deleteIdx);
            isChargeing = false;
            State_Stay();
        }
    }

    /// <summary>
    /// 장입
    /// </summary>
    /// <param name="data">장입할 소재 데이터</param>
    IEnumerator ChargeLogic(GameObject chargeSlab)
    {
        //장입로직이 끝나면
        //장입시간 3초
        Debug.Log("장입로직시작! :" + chargeSlab.name);
        Debug.Log("장입로 위치로 순간이동:" + chargeSlab.name);

        LogManager.del_eventLog("Slab 장입 : " + chargeSlab.name);
        State_Extract();
        //m_furnaceTracking.func_EnterMove(0, 10 + padding, this.GetComponent<furnaceManager>());
        //장입로 시작위치로 이동시키기
        yield return new WaitForSeconds(1f);

        m_furnaceTracking.func_EnterMove(10chargeSlab.name);

        yield return new WaitForSeconds(3f);
        //장입종료
        //순간이동?
        Debug.Log("장입로직끝! :" + chargeSlab.name);
        //움직일 거리가 있다면 가열로 움직이기 시작
        isChargeing = false;
        State_Stay();
        //    if (moveDistance != 0)
        //    {
        //        StartCoroutine(MoveLogic(moveDistance));
        //    }
    }
    
    


    /// <summary>
    /// 가열로 동작 루틴
    /// </summary>
    /// <param name="currentPos">시작위치</param>
    /// <param name="targetPos">목표위치</param>
    /// <returns></returns>
    IEnumerator MoveLogic(float currentPos,float targetPos)
    {

        //Debug.Log("currentPos:" + currentPos);
        //Debug.Log("targetPos:" + targetPos);
        //Debug.Log("isChargeing :" + isChargeing);

        yield return new WaitUntil(() => !isChargeing);

        //Debug.Log("Tracking시작!!");
        State_running();
        m_furnaceTracking.func_Slab_Set_Position(currentPostargetPos);

        //움직이는게 끝나면
        yield return new WaitUntil(()=>m_furnaceTracking.OneCycle == null);
        moveDistance = 0;
        State_Stay();


    }



    public void CreateSlab(TBL_FUR_SLAB_TRK_ITEM.SlabTRKItem item)
    {
        if (string.IsNullOrEmptyitem.slabNo))
        {
            return;
        }

        GameObject GameObj = Instantiate(prefab_slabFce_Start_Init_Pos);
        SlabInfo si = GameObj.AddComponent<SlabInfo>();
        GameObj.name = "SlabNo_" + item.slabNo;
        si.Slab_No = item.slabNo;
        si.Pos = item.pos;
        si.Fce_No = fce_No;

        
        
        GameObj.transform.localPosition = new Vector3(00, (si.Pos * CreateOffset));
        GameObj.transform.GetChild(1).GetComponent<TextMesh>().text = item.slabNo;
        string zone = "예열대";

        if (26900 > item.pos && item.pos >= 14400)
        {
            zone = "가열대";
        }
        else if (item.pos >= 26900)
        {
            zone = "균열대";
        }

        //형상화 정보 데이터 요청
        //WebSocket.reqSizeData(item.slabNo);
        //콜하는구문
        //붙어있는거 모든게 콜되는 방식임
        FCE_JOB.CreateSlabEventHandler(thisnew CreateSlabEventArgs() { fceNo = si.Fce_NoslabNo = si.Slab_No });

        m_SearchManager.Create_btn(si.Slab_Nosi.TGTfce_No-1zoneGameObj.transform.GetChild(0).gameObject);
        current_FceSlabDatas.Insert(0si);
    }

    public void CreateSlab(TBL_FUR_SLAB_TRK_ITEM.SlabTRKItem item,Transform ChargePos)
    {

        Debug.Log("CreateSlab by ChargePos");

        if (item.slabNo == "")
        {
            //Debug.Log("return!!!!!!!");
            return;
        }

        GameObject GameObj = Instantiate(prefab_slabChargePos);
        SlabInfo si = GameObj.AddComponent<SlabInfo>();
        GameObj.name = "SlabNo_" + item.slabNo;
        si.Slab_No = item.slabNo;
        si.Pos = item.pos;
        si.Fce_No = fce_No;

        GameObj.transform.localPosition = new Vector3(00si.Pos * 0.001f);
        GameObj.transform.GetChild(1).GetComponent<TextMesh>().text = item.slabNo;
        string zone = "예열대";

        if (26900 > item.pos && item.pos >= 14400)
        {
            zone = "가열대";
        }
        else if (item.pos >= 26900)
        {
            zone = "균열대";
        }
        //형상화 정보 데이터 요청
        //WebSocket.reqSizeData(item.slabNo);
        //콜하는구문
        //붙어있는거 모든게 콜되는 방식임
        FCE_JOB.CreateSlabEventHandler(thisnew CreateSlabEventArgs() { fceNo = si.Fce_NoslabNo = si.Slab_No });

        m_SearchManager.Create_btn(si.Slab_Nosi.TGTfce_No - 1zoneGameObj.transform.GetChild(0).gameObject);
        current_FceSlabDatas.Insert(0si);
    }









    /// <summary>
    /// 
    /// </summary>
    /// <param name="items">주기마다 업데이트되어서 들어온 데이터</param>
    public void DataBinding(TBL_FUR_SLAB_TRK_ITEM items)
    {

        //current_TRK_ITEM.GetSLabNo()
        //item.GetSLabNo()
        SlabInfo compare_item// 현재 클라이언트의 데이터와 비교해서 있는것
        //가장처음 데이터 받아온 시점
        if (current_FceSlabDatas.Count == 0)
        {
            //바로생성
            for (int i = 0i < items.slabTrkArr.Lengthi++)
            {
                if (items.slabTrkArr[i].slabNo != null)
                    CreateSlab(items.slabTrkArr[i]);
            }

        }
        else
        {
            //추출체크
            CheckExtract(items);

            //비교
            for (int i = 0i < items.slabTrkArr.Lengthi++)
            {
                //compare_item = 현재 클라이언트에 존재하는 데이터
                compare_item = current_FceSlabDatas.FirstOrDefault(x => x.Slab_No == items.slabTrkArr[i].slabNo);

                if (compare_item == null)
                {
                    ///무조건 새로 생성하는곳 클라이언트에는 없고 받은데이터에는 있는데이터

                    if (i == 0)
                    {
                        if (current_FceSlabDatas[0].Slab_No != items.SLAB01)
                        {
                            //장입생성(아이템,장입위치)
                            CreateSlab(items.slabTrkArr[0], CharePos);

                            NullCheckStartCoroutine(cor_ChargeChargeLogic(current_FceSlabDatas[0].gameObject));
                            //if (cor_Charge != null)
                            //{
                            //    StopCoroutine(cor_Charge);
                            //    cor_Charge = null;
                            //}
                            //cor_Charge = ChargeLogic(current_FceSlabDatas[0].gameObject);
                            //StartCoroutine(cor_Charge);
                            isChargeing = true;
                        }
                    }
                    else
                    {
                        if (items.slabTrkArr[i].slabNo != "")//NULL => ""로 변경 0115
                        {
                            //Debug.Log("null인데 생성???");
                            CreateSlab(items.slabTrkArr[i]);
                        }
                    }
                }
                else
                {
                    
                    //클라이언트에 있는 데이터가 들어왔다! (slab넘으로 비교했을때...)
                    //거리의 차이만큼 위치이동
                    moveDistance = items.slabTrkArr[i].pos - compare_item.Pos;
                    compare_item.Pos = items.slabTrkArr[i].pos;
                    
                    if (moveDistance > 0 && !isChargeing)
                    {
                        int currentPos = items.slabTrkArr[i].pos - moveDistance;

                        NullCheckStartCoroutine(cor_MoveMoveLogic(currentPoscompare_item.Pos));

                        //if (cor_Move != null)
                        //{
                        //    StopCoroutine(cor_Move);
                        //    cor_Move = null;
                        //}
                        //cor_Move = MoveLogic(currentPos, compare_item.Pos);
                        //StartCoroutine(cor_Move);

                        //현재 삭제된 것이라면 동작 로직이 필요가 없다??
                        //타이밍이 안맞아서items.slabTrkArr[i].slabNo 로는 체크를 할수가 없다
                    }



                }
            }
        }
    }



    public void CheckExtract(TBL_FUR_SLAB_TRK_ITEM items)
    {
        //추출 체크
        int isExtract;


        
        foreach (var exitItem in current_FceSlabDatas)
        {
            isExtract = 0//위에서 선언하다 밑에서 선언으로 변경 한 아이템에 대한 조사만 하면 되니까
            foreach (var receiveItem in items.slabTrkArr)
            {
                if (exitItem.Slab_No == receiveItem.slabNo)
                {
                    isExtract = 1;
                }
            }

            if (isExtract == 0)
            {
                //추출해야할 데이터가 있음!!
                isChargeing = true;

                //두번실행되니까 비교용 Extractor 변수를 따로 만들어서 한번 Extractor를 한건지 채크하고 추출하자
                NullCheckStartCoroutine(cor_ExtractextractLogic(exitItem));
            }
        }

       
    }

    
    public void NullCheckStartCoroutine(IEnumerator corIEnumerator mydel)
    {
        if (cor != null)
        {
            StopCoroutine(cor);
            cor = null;
        }
        cor = mydel;
        StartCoroutine(cor);
    }


    void State_running()
    {
        txt_State.text = "Running";
        Img_state.color = new Color(02550);
        if(current_FceSlabDatas.Count !=0)
            txt_SlabNo.text = current_FceSlabDatas[0].name;
    }

    void State_Charge()
    {
        txt_State.text = "Charge";
        Img_st

ate.color = new Color(02550);
    }
    void State_Extract()
    {
        txt_State.text = "Extract";
        Img_state.color = new Color(02550);
    }
    

    void State_Stay()
    {
        txt_State.text = "Stop";
        Img_state.color = new Color(255255255);
        txt_SlabNo.text = "";
    }


}

#################################################

댓글 없음:

댓글 쓰기

git rejected error(feat. cherry-pick)

 문제 아무 생각 없이 pull을 받지않고 로컬에서 작업! 커밋, 푸시 진행을 해버렷다. push에선 remote와 다르니 당연히 pull을 진행해라고 하지만 로컬에서 작업한 내용을 백업하지 않고 진행하기에는 부담스럽다(로컬작업 유실 가능성) 해결하려...