GetMouseButtonUp returns true twice

Programowanie w Unity.

GetMouseButtonUp returns true twice

Postprzez avengerarrow » 17 Gru 2018, 01:56

When I Click to the object mouse returns true twice:
First when i click and attack - RunIfAttackAction(hit);
if the attack was after the move unit end turn and the next unit starts turn.
I don't know why but GetMouseButtonUp return true second time when next unit after the unit that attacked start turn. Input.GetMouseButtonUp(1) is true, but i no click. When i use logs I see that the button has been clicked twice.
Unit at the start should not return true of Input.GetMouseButtonUp(1).
How i can fix that?

Kod: Zaznacz wszystko
public class PlayerTurn : UnitMovement
{

    public AcctivePlayer APlay;

    void Start() {

        Initialization();
    }

    void Update() {

        if (UnitLive(this))
        {
            TurnManager.EndUnitTurn();
        }

        if (!unitTurn)
        {
            return;
        }

        APlay.Player = gameObject;

        RingCurentUnitTurn.GetUnitPosition(this);

        if (!alredyMoved)
        {
            if (!moving)
            {
                FindSelectableTiles();
            }
            else
            {
                Move();
            }
        }

        if (!alredyMoved || !alredyAttack)
        {
            if (Input.GetMouseButtonUp(1))
            {
                Debug.Log("Click");
                Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

                RaycastHit hit;
                if (Physics.Raycast(ray, out hit))
                {
                    if (EnemyTag(hit) && !alredyAttack)
                    {
                        RingSelectedEnemy.SetActiveRing();
                        RunIfAttackAction(hit);
                    }
                    else if (hit.collider.tag == "Tile")
                        RunIfMoveAction(hit);
                }
            }
        }
            //CheckMouse();

        if (alredyMoved && alredyAttack)
        {
            alredyMoved = false;
            alredyAttack = false;
            RemoveSelectableTiles();
            RingCurentUnitTurn.SetDeactiveRing();
            TurnManager.EndUnitTurn();
        }
    }

    public void ButtonPreviousUnit() {

        if (!alredyAttack && !alredyMoved)
        {
            RingCurentUnitTurn.SetDeactiveRing();
            TurnManager.PreviousUnit();
            RemoveSelectableTiles();
        }     
    }

    public void ButtonNextUnit() {

        if (!alredyAttack && !alredyMoved)
        {
            RingCurentUnitTurn.SetDeactiveRing();
            TurnManager.NextUnit();
            RemoveSelectableTiles();
        }   
    }

    public void ButtonEndUnitTurn() {

        alredyMoved = false;
        alredyAttack = false;
        RemoveSelectableTiles();
        RingCurentUnitTurn.SetDeactiveRing();
        TurnManager.EndUnitTurn();
    }

    public void ButtonEndTeamTurn() {

        alredyMoved = false;
        alredyAttack = false;
        RemoveSelectableTiles();
        RingCurentUnitTurn.SetDeactiveRing();
        TurnManager.EndTeamTurn();
    }
}
avengerarrow
 
Posty: 5
Rejestracja: 21 Lis 2018, 21:10
Has thanked: 0 time
Been thanked: 0 time

Re: GetMouseButtonUp returns true twice

Postprzez Hostur » 17 Gru 2018, 08:30

I refactored this a little.
Firstly check logs, new one provides game object name.
Kod: Zaznacz wszystko
Debug.Log($"Click on object: '{gameObject.name}'.");

It shouldn't occur twice on single object.
Change a way of selecting units
Kod: Zaznacz wszystko
TurnManager.PreviousUnit();
TurnManager.NextUnit();

into something like this
Kod: Zaznacz wszystko
public void SelectUnit(bool next)
{
 if(next)
  NextUnit();
 else
  PreviousUnit();
}


than you can refactor your buttons logic

Kod: Zaznacz wszystko
private void OnUnitButtonClicked(bool next)
{
  if (!alredyAttack && !alredyMoved)
  {
    RingCurentUnitTurn.SetDeactiveRing();
    TurnManager.SelectUnit(next);
    RemoveSelectableTiles();
   }   
}


and this function can be invoked by buttons without code duplication like this:
Kod: Zaznacz wszystko
_previousUnitButton.onClick.AddListener(OnUnitButtonClicked(false));


The same with ButtonEndUnitTurn and ButtonEndTeamTurn. It is copy paste code in both of these functions.

Here is refactored one.
Kod: Zaznacz wszystko
public class PlayerTurn : UnitMovement
{
    public AcctivePlayer APlay;
   private Camera _camera;
   private RaycastHit _hit;
   
   [SerializeField]
   private Button _previousUnitButton;
   [SerializeField]
   private Button _nextUnitButton;
   [SerializeField]
   private Button _endUnitTurnButton;
   [SerializeField]
   private Button _endTeamTurnButton;
   
    private void Start()
   {
        Initialization();
      _camera = Camera.main;
      _previousUnitButton.onClick.AddListener(() => OnUnitButtonClicked(false));
      _nextUnitButton.onClick.AddListener(() => OnUnitButtonClicked(true));
      _endUnitTurnButton.onClick.AddListener(OnEndTurnButtonClicked);
      _endTeamTurnButton.onClick.AddListener(OnEndTurnButtonClicked);
      APlay.Player = gameObject;
    }

    private void Update()
   {
        if (UnitLive(this))
        {
            TurnManager.EndUnitTurn();
        }

        if (!unitTurn)
        {
            return;
        }

        RingCurentUnitTurn.GetUnitPosition(this);

        if (!alredyMoved)
        {
            if (!moving)
                FindSelectableTiles();
            else
                Move();
        }

        if (Input.GetMouseButtonUp(1) && (!alredyMoved || !alredyAttack))
        {
            PerformRaycast();
        }

       // Should not be placed in Update function, move it somewhere else.
        if (alredyMoved && alredyAttack)
        {
            OnEndTurnButtonClicked();
        }
    }
   
   private void PerformRaycast()
   {
      Debug.Log($"Click on object: '{gameObject.name}'.");
      Ray ray = _camera.ScreenPointToRay(Input.mousePosition);

      if (Physics.Raycast(ray, out _hit))
      {
         if (EnemyTag(_hit) && !alredyAttack)
         {
            RingSelectedEnemy.SetActiveRing();
            RunIfAttackAction(_hit);
         }
         else if (_hit.collider.tag == "Tile")
            RunIfMoveAction(_hit);
      }
   }
   
   private void OnUnitButtonClicked(bool next)
   {
     if (!alredyAttack && !alredyMoved)
     {
      RingCurentUnitTurn.SetDeactiveRing();
      TurnManager.SelectUnit(next);
      RemoveSelectableTiles();
      }   
   }

   private void OnEndTurnButtonClicked()
   {
      alredyMoved = false;
        alredyAttack = false;
        RemoveSelectableTiles();
        RingCurentUnitTurn.SetDeactiveRing();
        TurnManager.EndUnitTurn();
   }
}
Hostur
 
Posty: 696
Rejestracja: 05 Sie 2015, 07:36
Has thanked: 0 time
Been thanked: 0 time


Wróć do Skrypty

Kto jest na forum

Użytkownicy przeglądający to forum: Brak zarejestrowanych użytkowników oraz 1 gość

cron