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());
}
}