Cursor

1.Cursor Image

커서의 이미지는 따로 Texture Type을 지정해주어야 한다. import한 이미지를 클릭하여 보면 설정을 바꿀 수 있다. 바꾼 뒤에는 apply를 꼭 눌러야 한다.

< Texture Type 변경 >

< 커서의 Texture >

2.Code

커서는 상황 별로 구분되어 Texture가 바뀌게 된다.

1)default


< default >
커서의 이미지는 메이플 스토리의 기본 커서이다.

    public Texture2D CT_normal;
    public Texture2D[] CT_focus;
    public Texture2D CT_attack;
    public Texture2D CT_view;
    public Texture2D CT_btn;
    public Texture2D CT_btnclick;
    public Texture2D CT_cardon;
    public Texture2D CT_catch;
    public static cursor Inst { get; private set; }
    void Awake() => Inst = this;

    public void Start()
    {
        StartCoroutine(Normal());
    }
    public IEnumerator Normal()
    {
        yield return null;
        Cursor.SetCursor(CT_normal, Vector2.zero, CursorMode.Auto);

    }

코루틴을 통해 시작되고, 커서의 이미지가 변경된다.

2)View


< view >
커서가 entity 위에 올라가 tooltip이 활성화 되면 변경된다.

    //Cursor.cs
    public IEnumerator View()
    {
        yield return null;
        Cursor.SetCursor(CT_view,Vector2.zero,CursorMode.Auto);
    }
    //Entity.cs
    void OnMouseEnter()
    {
        if(Input.GetMouseButton(0))
            StartCoroutine(cursor.Inst.Focus()); 
        else
        {
            if (this.isMine)
            {
                StartCoroutine(cursor.Inst.Normal()); //공격 모션을 취하기 위해 view가 아닌 다른 cursor가 적용
            }
            else
            {
                StartCoroutine(cursor.Inst.View()); // 상대 entity의 정보 확인
            }
        }
    }

3)Focus


< Focus >
마우스로 내 entity를 클릭한 후 드래그하면서 상대 entity 위에 마우스가 올라가면 이 때 마우스 커서가 위의 이미지들이 0.2초 간격으로 바뀐다.

    //cursor.cs
    public IEnumerator Focus()
    {

        for (int i = 0; i < 7; i++)
        {
            Cursor.SetCursor(cursor.Inst.CT_focus[i], Vector2.zero, CursorMode.Auto);
            yield return new WaitForSeconds(0.2f);
        }
    }
    //Entity.cs
    void OnMouseEnter()
    {
        if(Input.GetMouseButton(0))
            StartCoroutine(cursor.Inst.Focus()); // focus
        else
        {
            if (this.isMine)
            {
                StartCoroutine(cursor.Inst.Normal()); //공격 모션을 취하기 위해 view가 아닌 다른 cursor가 적용
            }
            else
            {
                StartCoroutine(cursor.Inst.View()); // 상대 entity의 정보 확인
            }
        }
    }

4)Attack


< Attack >
내 entity를 클릭한 채로 드래그해서 상대 entity 위에서 마우스를 놓을 때 이 이미지의 커서로 바뀐다.

    public IEnumerator Attack()
    {
        yield return null;
        Cursor.SetCursor(CT_attack,Vector2.zero,CursorMode.Auto);
    }
    public void Attack(Entity attacker, Entity defender)
    {
        if (defender.canBeAttacked == false && attacker.ablcode1 !=21)
        {
            return;
        }
        attacker.attackable = false;
        attacker.GetComponent<Order>().SetMostFrontOrder(true);
        if (attacker.isMine)
        {
            if (defender.isBossOrEmpty)
            {
                byte[] send = new byte[3] { 0x00, Convert.ToByte(attacker.gameObject.name), Convert.ToByte("0") };
                BackEndMatch.SendMessage(send);
            }
            else
            {
                byte[] send = new byte[3] { 0x00, Convert.ToByte(attacker.gameObject.name), Convert.ToByte(defender.gameObject.name) };
                BackEndMatch.SendMessage(send);
            }
            AbilityManager.Inst.eTurnState = AbilityManager.ETurnState.attacking;
            AbilityManager.Inst.stateTrigger = true;
            if (AbilityManager.Inst.abilityNum[attacker.ablcode1].state == (int)AbilityManager.ETurnState.attacking || AbilityManager.Inst.abilityNum[defender.ablcode1].state == (int)AbilityManager.ETurnState.beAttacked)
            {
                castEntity = attacker;
                return;
            }
        }
        Sequence sequence = DOTween.Sequence()
            .Append(attacker.transform.DOMove(defender.transform.position, 0.4f)).SetEase(Ease.InSine)
            .AppendCallback(() =>
            {
                attacker.Damaged(defender.attack);
                defender.Damaged(attacker.attack);
                SpawnDamage(defender.attack, attacker.transform);
                SpawnDamage(attacker.attack, defender.transform);
            })
            .Append(attacker.transform.DOMove(attacker.originPos, 0.4f)).SetEase(Ease.OutSine)
            .OnComplete(() => AttackCallback(attacker, defender));
        StartCoroutine(cursor.Inst.Attack()); // 위의 코드는 추후에 설명할 예정
    }

5)OnButton


< OnButton >

    public void OnBtn()
    {
        Cursor.SetCursor(CT_btn,Vector2.zero,CursorMode.Auto);
    }


< Event Trigger >
Event Trigger를 만들어서 버튼 위로 마우스가 올라갈 때, 마우스가 나갈 때, 마우스를 클릭 했을 때에 작동하고, 각 함수가 동작되며 각 함수는 커서의 이미지를 바꾼다.

6)ButtonClick


< ButtonClick >

    //cursor.cs
    public void ClickBtn()
    {
        Cursor.SetCursor(CT_btnclick,Vector2.zero,CursorMode.Auto);
    }

7)OnCard


< OnCard >

    //cursor.cs
    public IEnumerator OnCard()
    {
        yield return null;
        Cursor.SetCursor(CT_cardon,Vector2.zero,CursorMode.Auto);
    }
    //card.cs
    void OnMouseEnter() 
    {
        if(isFront)
            StartCoroutine(cursor.Inst.OnCard());
    }

8)CatchCard


< CatchCard >

    //cursor.cs
    public IEnumerator CatchCard()
    {
        yield return null;
        Cursor.SetCursor(CT_catch,Vector2.zero,CursorMode.Auto);
    }
    //card.cs
    void OnMouseDown() 
    {
        if(isFront) // true는 내 카드라는 것
        {
            CardManager.Inst.CardMouseDown();
            StartCoroutine(cursor.Inst.CatchCard()); 
        }   
    }