コード例 #1
0
    //鼠标移出
    public void OnNodeUnhovered(NodeItem_Battle _node)
    {
        _node.RestoreBackgroundColor();

        CursorManager.instance.ChangeCursor();
        CursorManager.instance.ChangeCursorAngle();

        //显示并更新单位属性UI
        //BattleManager.instance.ShowUnitStatUI(false);

        if (_node.unit != null &&
            _node.unit != BattleManager.currentActionUnit)
        {
            UnitHaloMgr.instance.HaloFlashStop(_node.unit);
        }

        //有则清除之前路径
        if (path != null)
        {
            ClearPath();
        }

        playerHovered = null;
    }
コード例 #2
0
    //节点被点击
    public void OnNodePressed(NodeItem_Battle _node)
    {
        //设定指令
        if (_node.battleNodeType == BattleNodeType.reachable)
        {
            //多种移动方式
            if (BattleManager.currentActionUnit.isWalker)
            {
                UnitActionMgr.order = new Order(OrderType.move,
                                                BattleManager.currentActionUnit, path);
            }
            else if (TraitManager.PossessTrait(BattleManager.currentActionUnit, "Flying"))
            {
                UnitActionMgr.order = new Order(OrderType.move,
                                                BattleManager.currentActionUnit, _node);
            }
        }
        else if (_node.battleNodeType == BattleNodeType.attackable)
        {
            Unit target = _node.unit;

            if (BattleManager.currentActionUnit.IsRangeAttack)
            {
                UnitActionMgr.order = new Order(OrderType.rangeAttack,
                                                BattleManager.currentActionUnit, target);
            }
            else
            {
                //如果targetNode就是攻击者所在节点,直接攻击
                if (targetNode == BattleManager.currentActionUnit.nodeItem)
                {
                    UnitActionMgr.order = new Order(OrderType.attack,
                                                    BattleManager.currentActionUnit, target);
                }
                else
                {
                    if (BattleManager.currentActionUnit.isWalker)
                    {
                        if (path != null)
                        {
                            UnitActionMgr.order = new Order(OrderType.attack,
                                                            BattleManager.currentActionUnit, path, target);
                        }
                        else
                        {
                            Debug.LogError("攻击无路径BUG");
                        }
                    }
                    else
                    {
                        UnitActionMgr.order = new Order(OrderType.attack,
                                                        BattleManager.currentActionUnit, targetNode, target);
                    }
                }
            }
        }
        else if (_node.battleNodeType == BattleNodeType.spellable)
        {
            //隐藏可施法节点
            NodeSelector.HideSpellableNodes();
            //施法
            MagicManager.instance.CastMagic(_node);
        }

        if (_node.battleNodeType != BattleNodeType.empty)
        {
            if (path != null)
            {
                ClearPath();
            }
            CursorManager.instance.ChangeCursor();
            CursorManager.instance.ChangeCursorAngle();
        }
    }
コード例 #3
0
    //鼠标进入节点
    public void OnNodeHovered(NodeItem_Battle _node)
    {
        _node.ChangeBackgoundColor("hover");

        playerHovered = _node;

        //是可到达节点,则显示路径
        if (_node.battleNodeType == BattleNodeType.reachable)
        {
            CursorManager.instance.ChangeCursor("reachable");

            //是地面移动单位,则计算路径
            if (BattleManager.currentActionUnit.isWalker)
            {
                //print("hover");
                FindPath(BattleManager.currentActionUnit, _node);
            }
        }
        else if (_node.battleNodeType == BattleNodeType.attackable)
        {
            if (BattleManager.currentActionUnit.IsRangeAttack)
            {
                //(有远程伤害不减的特质),或者距离10以内
                //TraitManager.PossessTrait(BattleManager.currentActionUnit, "No melee penalty") ||
                if (AStarManager.GetNodeItemDistance(BattleManager.currentActionUnit.nodeItem,
                                                     _node, true) <= BattleManager.instance.rangeAttackRange)
                {
                    CursorManager.instance.ChangeCursor("arrow");
                }
                else
                {
                    CursorManager.instance.ChangeCursor("arrow_penalty");
                }
            }

            //显示文本
            BattleInfoMgr.instance.SetText_Attack(BattleManager.currentActionUnit, _node.unit);
        }
        else if (_node.battleNodeType == BattleNodeType.spellable)
        {
            CursorManager.instance.ChangeCursor("spell");
        }
        else
        {
            //如果不是可行动节点
            //如果是单位
            if (_node.nodeObject != null &&
                _node.nodeObject.nodeObjectType == NodeObjectType.unit)
            {
                //显示并更新单位属性UI
                //BattleManager.instance.ShowUnitStatUI(true, _node.unit);

                //如果不是当前行动单位,开始闪烁
                if (_node.nodeObject != BattleManager.currentActionUnit)
                {
                    if (BattleManager.instance.isSamePlayer(_node.unit,
                                                            BattleManager.currentActionUnit))
                    {
                        UnitHaloMgr.instance.HaloFlashStart(_node.unit, "friend");
                    }
                    else
                    {
                        UnitHaloMgr.instance.HaloFlashStart(_node.unit, "enemy");
                    }
                }

                //根据敌友改变指针
                if (BattleManager.instance.isSamePlayer(_node.unit,
                                                        BattleManager.currentActionUnit))
                {
                    CursorManager.instance.ChangeCursor("friend");
                }
                else
                {
                    CursorManager.instance.ChangeCursor("enemy");
                }
            }
        }
        //不可到达点
        // else if (_node.battleNodeType == BattleNodeType.empty)
        // {
        //     CursorManager.instance.ChangeCursor("stop");
        // }
    }
コード例 #4
0
    //鼠标移动
    public void OnMouseMoved(NodeItem_Battle _node)
    {
        //右键点击
        if (Input.GetMouseButtonDown(1))
        {
            if (_node.nodeObject != null &&
                _node.nodeObject.nodeObjectType == NodeObjectType.unit)
            {
                //显示并更新单位信息面板
                BattleManager.instance.panel_unitInfo.Set(_node.unit);
                //移动单位面板到鼠标位置
                Vector3 pos = BattleManager.instance.cam.ScreenToWorldPoint(Input.mousePosition);
                pos.z = 0;
                BattleManager.instance.panel_unitInfo.transform.position = pos;
            }

            return;
        }
        //右键起
        if (Input.GetMouseButtonUp(1))
        {
            //隐藏单位信息面板
            BattleManager.instance.panel_unitInfo.Quit();

            return;
        }

        //判断玩家是当前行动者,可能有问题
        //if (BattleManager.players[BattleManager.currentActionUnit.side] != GameManager.player)
        //return;

        //不响应鼠标小范围移动
        if (Vector3.Distance(Input.mousePosition, lastMousePos) < mouseMoveSensitivity)
        {
            return;
        }
        else
        {
            lastMousePos = Input.mousePosition;
        }

        //if可攻击
        if (_node.battleNodeType == BattleNodeType.attackable)
        {
            //如果是远程攻击,直接跳过
            if (BattleManager.currentActionUnit.IsRangeAttack)
            {
                return;
            }

            Vector2 mousePoint = BattleManager.instance.cam.ScreenToWorldPoint(Input.mousePosition);
            Vector3 dir        = mousePoint - (Vector2)_node.transform.position;
            dir.y -= 0.9f;
            //计算鼠标和节点角度
            float angle;
            if (dir.x > 0)
            {
                angle = Vector3.Angle(dir, Vector3.up);
            }
            else
            {
                angle = 360 - Vector3.Angle(dir, Vector3.up);
            }
            //计算箭头角度
            int arrowIndex = (int)angle / 60;

            //攻击方向上的格子存在,且可到达便可发起攻击。或者直接就是当前单位所在格子
            targetNode = BattleManager.instance.map.GetNearbyNodeItem(_node, arrowIndex);

            if (targetNode != null &&
                (targetNode.GetComponent <NodeItem_Battle>().battleNodeType == BattleNodeType.reachable ||
                 targetNode.nodeObject == BattleManager.currentActionUnit))
            {
                //根据角度显示攻击箭头
                int arrowAngle      = (arrowIndex * 60 + 210) % 360;
                int arrowAngleFixed = 360 - arrowAngle;

                CursorManager.instance.ChangeCursor("sword");
                CursorManager.instance.ChangeCursorAngle(arrowAngleFixed);

                //攻击方向上的节点不是当前行动单位,否则直接攻击无需寻路
                if (targetNode.nodeObject != BattleManager.currentActionUnit)
                {
                    //是近战单位则显示路径
                    if (BattleManager.currentActionUnit.isWalker)
                    {
                        FindPath(BattleManager.currentActionUnit, targetNode);
                    }
                }
            }
            else
            {
                CursorManager.instance.ChangeCursor("enemy");
                CursorManager.instance.ChangeCursorAngle();
            }
        }
    }