예제 #1
0
    public int GetTouchObjID()
    {
        int        object_id          = -1;
        float      skill_blear_radius = 0.5f;
        Vector3    touch_pos          = new Vector3(position.x, position.y, 0);
        Ray        ray = Camera.main.ScreenPointToRay(touch_pos);
        RaycastHit hitInfo;
        GameObject hitGameObj = null;
        int        layermask  = (1 << LayerMask.NameToLayer("Terrains"))
                                | (1 << LayerMask.NameToLayer("Character"));
        SkillControllerInterface player_skill_ctrl = GetControl();

        if (null != player_skill_ctrl)
        {
            SkillInputData skill_input_data = player_skill_ctrl.GetSkillInputData(SkillTags);
            if (null != skill_input_data)
            {
                skill_blear_radius = skill_input_data.targetChooseRange;
            }
        }
        if (Physics.Raycast(ray, out hitInfo, 200f, layermask))
        {
            Collider[] hitObjs = Physics.OverlapSphere(hitInfo.point, skill_blear_radius, (1 << LayerMask.NameToLayer("Character")));
            if (hitObjs.Length > 0)
            {
                hitGameObj = hitObjs[0].gameObject;
                if (null != hitGameObj)
                {
                    SharedGameObjectInfo targetInfo = LogicSystem.GetSharedGameObjectInfo(hitGameObj);
                    if (null != targetInfo && IsEnemy())
                    {
                        // camp
                        int        camp_self = -1;
                        GameObject goSelf    = DashFire.LogicSystem.PlayerSelf;
                        if (null != goSelf)
                        {
                            CharacterCamp camp_s = goSelf.GetComponent <CharacterCamp>();
                            if (null != camp_s)
                            {
                                camp_self = camp_s.m_CampId;
                            }
                        }
                        CharacterCamp camp_t = hitGameObj.GetComponent <CharacterCamp>();
                        if (camp_t != null && camp_self != camp_t.m_CampId &&
                            targetInfo.Blood > 0)
                        {
                            object_id = targetInfo.m_LogicObjectId;
                        }
                    }
                }
            }
        }

        if (-1 != object_id && null != hitGameObj)
        {
            GfxSystem.PublishGfxEvent("Op_InputEffect", "Input", GestureEvent.OnSingleTap, hitGameObj.transform.position.x, hitGameObj.transform.position.y, hitGameObj.transform.position.z, true, false);
        }

        return(object_id);
    }
예제 #2
0
    private void UpdateAfterSkillAutoAttack()
    {
        if (m_WaiteSkillBuffer.Count > 0)
        {
            return;
        }

        if (m_CurSkillNode != null)
        {
            if (Time.time > GetWaitInputTime(m_CurSkillNode))
            {
                return;
            }
            IShooterSkill ss         = m_SkillManager.GetSkillById(m_CurSkillNode.SkillId);
            SkillNode     attackNode = m_SkillCategoryDict[SkillCategory.kAttack];
            if (ss != null && ss.IsAttackAfterSkill() &&
                attackNode != null && IsSkillCanBreak(m_CurSkillNode, attackNode.Category) &&
                m_WaiteSkillBuffer.Count == 0)
            {
                Vector3 targetPos;
                if (TriggerImpl.GetCurTargetPos(m_SkillManager.GetOwner(), out targetPos))
                {
                    SkillInputData data = GetSkillInputData(SkillCategory.kAttack);
                    if (data != null && Vector3.Magnitude(targetPos - m_SkillManager.GetOwner().transform.position) <= data.castRange)
                    {
                        StartAttack(targetPos);
                    }
                }
            }
        }
    }
예제 #3
0
    public static GestureArgs ToGestureArgs(Gesture args)
    {
        if (null == args)
        {
            return(null);
        }

        GestureArgs e = new GestureArgs();

        e.startPositionX = args.StartPosition.x;
        e.startPositionY = args.StartPosition.y;
        e.positionX      = args.Position.x;
        e.positionY      = args.Position.y;

        e.startTime   = args.StartTime;
        e.elapsedTime = args.ElapsedTime;
        Vector3 pos = args.GetTouchToWorldPoint();

        e.gamePosX = pos.x;
        e.gamePosY = pos.y;
        e.gamePosZ = pos.z;
        e.name     = args.Recognizer.EventMessageName;

        GameObject go      = DashFire.LogicSystem.PlayerSelf;
        Vector3    srcPos  = args.GetStartTouchToWorldPoint();
        Vector3    destPos = pos;

        if (null != go)
        {
            destPos = go.transform.position;
        }
        e.towards       = Geometry.GetYAngle(new ScriptRuntime.Vector2(destPos.x, destPos.z), new ScriptRuntime.Vector2(srcPos.x, srcPos.z));
        e.moveType      = curTouchState;
        e.selectedObjID = args.SelectedID;
        e.sectionNum    = args.SectionNum;

        Vector3 airWellPos = args.GetTouchToAirWallWorldPoint();

        e.airWelGamePosX = airWellPos.x;
        e.airWelGamePosY = airWellPos.y;
        e.airWelGamePosZ = airWellPos.z;

        e.startGamePosX = srcPos.x;
        e.startGamePosY = srcPos.y;
        e.startGamePosZ = srcPos.z;
        ///
        e.attackRange = 3f;
        SkillControllerInterface skill_contrl = GetControl();

        if (null != skill_contrl)
        {
            SkillInputData skill_input_data = skill_contrl.GetSkillInputData(args.SkillTags);
            if (null != skill_input_data)
            {
                e.attackRange = skill_input_data.castRange;
            }
        }

        return(e);
    }
예제 #4
0
    public override void StartAttack(Vector3 targetpos)
    {
        if (targetpos == Vector3.zero)
        {
            base.StartAttack(targetpos);
            return;
        }
        GameObject owner     = m_SkillManager.GetOwner();
        Vector3    xz_vector = targetpos - owner.transform.position;

        xz_vector.y = 0;
        float          distance   = xz_vector.magnitude;
        SkillInputData data       = GetRealSkillInputData(SkillCategory.kAttack);
        SkillInputData flash_data = GetRealSkillInputData(SkillCategory.kFlashAttack);

        if (data != null && distance > data.castRange && flash_data != null && distance <= flash_data.castRange)
        {
            CancelBreakSkillTask();
            SetFaceDir(targetpos);
            SkillNode node = AddCategorySkillNode(SkillCategory.kFlashAttack);
            if (node != null)
            {
                node.TargetPos = targetpos;
            }
            m_IsAttacking = true;
        }
        else
        {
            base.StartAttack(targetpos);
        }
    }
예제 #5
0
    public Vector3 GetStartTouchToWorldPoint()
    {
        float      skill_blear_radius   = 0.5f;
        Vector3    start_touch_worldpos = Vector3.zero;
        Vector3    start_touch_pos      = new Vector3(startPosition.x, startPosition.y, 0);
        Ray        ray = Camera.main.ScreenPointToRay(start_touch_pos);
        RaycastHit hitInfo;
        //int layermask = (1 << LayerMask.NameToLayer("AirWall"));
        //layermask |= 1 << LayerMask.NameToLayer("Character");
        //layermask |= 1 << LayerMask.NameToLayer("Player");
        //layermask |= 1 << LayerMask.NameToLayer("SceneObjEffect");
        //layermask |= 1 << LayerMask.NameToLayer("SceneObj");
        //layermask = ~layermask;
        int layermask = (1 << LayerMask.NameToLayer("Terrains"))
                        | (1 << LayerMask.NameToLayer("Character"));
        SkillControllerInterface player_skill_ctrl = GetControl();

        if (null != player_skill_ctrl)
        {
            SkillInputData skill_input_data = player_skill_ctrl.GetSkillInputData(SkillTags);
            if (null != skill_input_data)
            {
                skill_blear_radius = skill_input_data.targetChooseRange;
            }
        }
        if (Physics.Raycast(ray, out hitInfo, 200f, layermask))
        {
            start_touch_worldpos = hitInfo.point;
            GameObject go = DashFire.LogicSystem.PlayerSelf;
            if (null != go)
            {
                Vector3    srcPos           = go.transform.position;
                Vector3    targetPos        = start_touch_worldpos;
                float      length           = Vector3.Distance(srcPos, targetPos);
                RaycastHit airWallHitInfo   = new RaycastHit();
                int        airWallLayermask = 1 << LayerMask.NameToLayer("AirWall");
                Vector3    direction        = (targetPos - srcPos).normalized;
                if (Physics.Raycast(go.transform.position, direction, out airWallHitInfo, length, airWallLayermask))
                {
                    BoxCollider bc = airWallHitInfo.collider.gameObject.GetComponent <BoxCollider>();
                    if (null != bc && !bc.isTrigger)
                    {
                        start_touch_worldpos = airWallHitInfo.point;
                    }
                }
            }
            Collider[] hitObjs = Physics.OverlapSphere(start_touch_worldpos, skill_blear_radius, (1 << LayerMask.NameToLayer("Character")));
            if (hitObjs.Length > 0)
            {
                start_touch_worldpos = hitObjs[0].gameObject.transform.position;
            }
        }

        return(start_touch_worldpos);
    }
예제 #6
0
    public UnityEngine.Vector3 GetStartTouchToWorldPoint()
    {
        if (null == UnityEngine.Camera.main)
        {
            return(UnityEngine.Vector3.zero);
        }
        float skill_blear_radius = 0.5f;

        UnityEngine.Vector3    start_touch_worldpos = UnityEngine.Vector3.zero;
        UnityEngine.Vector3    start_touch_pos      = new UnityEngine.Vector3(startPosition.x, startPosition.y, 0);
        UnityEngine.Ray        ray = UnityEngine.Camera.main.ScreenPointToRay(start_touch_pos);
        UnityEngine.RaycastHit hitInfo;

        SkillController player_skill_ctrl = null;

        if (null != player_skill_ctrl)
        {
            SkillInputData skill_input_data = player_skill_ctrl.GetSkillInputData(SkillTags);
            if (null != skill_input_data)
            {
                skill_blear_radius = skill_input_data.targetChooseRange;
            }
        }
        if (UnityEngine.Physics.Raycast(ray, out hitInfo, 200f, m_TerrainAndCharacterLayer))
        {
            start_touch_worldpos = hitInfo.point;
            UnityEngine.GameObject go = ArkCrossEngine.LogicSystem.PlayerSelf;
            if (null != go)
            {
                UnityEngine.Vector3 srcPos    = go.transform.position;
                UnityEngine.Vector3 targetPos = start_touch_worldpos;
                float length = UnityEngine.Vector3.Distance(srcPos, targetPos);
                UnityEngine.RaycastHit airWallHitInfo = new UnityEngine.RaycastHit();
                int airWallLayermask          = 1 << UnityEngine.LayerMask.NameToLayer("AirWall");
                UnityEngine.Vector3 direction = (targetPos - srcPos).normalized;
                if (UnityEngine.Physics.Raycast(go.transform.position, direction, out airWallHitInfo, length, airWallLayermask))
                {
                    UnityEngine.BoxCollider bc = airWallHitInfo.collider.gameObject.GetComponent <UnityEngine.BoxCollider>();
                    if (null != bc && !bc.isTrigger)
                    {
                        start_touch_worldpos = airWallHitInfo.point;
                    }
                }
            }
            UnityEngine.Collider[] hitObjs = UnityEngine.Physics.OverlapSphere(start_touch_worldpos, skill_blear_radius, m_CharacterLayer);
            if (hitObjs.Length > 0)
            {
                start_touch_worldpos = hitObjs[0].gameObject.transform.position;
            }
        }

        return(start_touch_worldpos);
    }
예제 #7
0
    public override SkillInputData GetSkillInputData(SkillCategory category)
    {
        SkillNode head = null;

        if (m_SkillCategoryDict.TryGetValue(category, out head))
        {
            IShooterSkill ss = m_SkillManager.GetSkillById(head.SkillId);
            if (ss != null)
            {
                SkillInputData data = new SkillInputData();
                data.castRange         = ss.GetSkillCastRange();
                data.targetChooseRange = ss.GetTargetChooseRange();
                return(data);
            }
        }
        return(null);
    }
예제 #8
0
    private SkillInputData GetRealSkillInputData(SkillCategory category)
    {
        SkillNode head = null;

        if (m_SkillCategoryDict.TryGetValue(category, out head))
        {
            SkillScript ss = m_SkillManager.GetSkillById(head.SkillId);
            if (ss != null)
            {
                SkillInputData data = new SkillInputData();
                data.castRange         = ss.m_SkillCastRange;
                data.targetChooseRange = ss.m_TargetChooseRange;
                return(data);
            }
        }
        return(null);
    }
예제 #9
0
    public int GetTouchObjID()
    {
        if (null == UnityEngine.Camera.main)
        {
            return(-1);
        }
        int   object_id          = -1;
        float skill_blear_radius = 2.5f;

        UnityEngine.Vector3    touch_pos = new UnityEngine.Vector3(position.x, position.y, 0);
        UnityEngine.Ray        ray       = UnityEngine.Camera.main.ScreenPointToRay(touch_pos);
        UnityEngine.RaycastHit hitInfo;
        UnityEngine.GameObject hitGameObj        = null;
        SkillController        player_skill_ctrl = null;

        if (null != player_skill_ctrl)
        {
            SkillInputData skill_input_data = player_skill_ctrl.GetSkillInputData(SkillTags);
            if (null != skill_input_data)
            {
                skill_blear_radius = skill_input_data.targetChooseRange;
            }
        }
        if (UnityEngine.Physics.Raycast(ray, out hitInfo, 200f, m_TerrainAndCharacterLayer))
        {
            UnityEngine.Collider[] hitObjs = UnityEngine.Physics.OverlapSphere(hitInfo.point, skill_blear_radius, m_CharacterLayer);
            if (hitObjs.Length > 0)
            {
                hitGameObj = hitObjs[0].gameObject;
                if (null != hitGameObj)
                {
                    if (WorldSystem.Instance.IsPureClientScene())
                    {
                        SignNpcType signNpcTypeScript = hitGameObj.GetComponent <SignNpcType>();
                        if (signNpcTypeScript != null)
                        {
                            LogicSystem.EventChannelForGfx.Publish("ge_npc_click", "ui", signNpcTypeScript.GetNpcType());
                        }
                        ///
                        SharedGameObjectInfo assit_target = LogicSystem.GetSharedGameObjectInfo(hitGameObj);
                        if (null != assit_target)
                        {
                            ClickNpcManager.Instance.Execute(assit_target.m_ActorId);
                        }
                    }
                    SharedGameObjectInfo selfInfo   = LogicSystem.PlayerSelfInfo;
                    SharedGameObjectInfo targetInfo = LogicSystem.GetSharedGameObjectInfo(hitGameObj);
                    if (null != targetInfo && null != selfInfo)
                    {
                        // camp
                        if (ArkCrossEngine.CharacterInfo.GetRelation(selfInfo.CampId, targetInfo.CampId) == ArkCrossEngine.CharacterRelation.RELATION_ENEMY && targetInfo.Blood > 0)
                        {
                            object_id = targetInfo.m_LogicObjectId;
                        }
                        if (WorldSystem.Instance.IsPureClientScene())
                        {
                            if (targetInfo.IsPlayer && targetInfo.m_ActorId != LogicSystem.PlayerSelfInfo.m_ActorId)
                            {
                                LogicSystem.EventChannelForGfx.Publish("check_player_info", "ui", targetInfo.m_ActorId);
                            }
                        }
                    }
                }
            }
        }

        if (-1 != object_id && null != hitGameObj)
        {
            GfxSystem.PublishGfxEvent("Op_InputEffect", "Input", GestureEvent.OnSingleTap, hitGameObj.transform.position.x, hitGameObj.transform.position.y, hitGameObj.transform.position.z, true, false);
        }

        return(object_id);
    }