示例#1
0
    public override bool StartSkill(Vector3 targetPos)
    {
        ResetSkill();
        CDBeginTime = Time.time;
        Vector3 curTargetPos;

        if (UseCurTargetPos)
        {
            if (TriggerImpl.GetCurTargetPos(this.gameObject, out curTargetPos))
            {
                targetPos = curTargetPos;
            }
            else
            {
                return(StopSkill());
            }
        }
        if (UseFaceTargetPos || targetPos == Vector3.zero)
        {
            TargetPos = Script_Util.GetRoleFaceTargetPos(this.gameObject);
        }
        else
        {
            TargetPos = targetPos;
            AdjustTargetPos();
        }
        TriggerImpl.ResetTarget(this.gameObject);
        SkillComponent.ChangeSection((int)SkillSection.ShootStart);
        return(true);
    }
示例#2
0
    /// param:Id[对应到SkillSceneObjManager中的SoundEffect Id], pos[场景绝对位置]
    /// example:2,0 2 3
    public void Trigger_PlaySoundAtPosBySoundId(string param)
    {
#if SHOOTER_LOG
        Debug.Log("Trigger_PlaySoundAtPosBySoundId param:" + param);
#endif
        SkillSceneObjInfo sobjInfo  = new SkillSceneObjInfo(param);
        Vector3           targetPos = Vector3.zero;
        try {
            if (sobjInfo.paramOther.Count > 0)
            {
                targetPos = Script_Util.ToVector3(sobjInfo.paramOther[0]);
            }
            else
            {
                Debug.Log("Trigger_PlaySoundAtPosBySoundId miss pos");
                return;
            }
        } catch (System.Exception ex) {
            Debug.Log("Trigger_PlaySoundAtPosBySoundId pos convert error");
            return;
        }

        if (m_SceneObjMgr != null)
        {
            SkillSoundInfo soundInfo = m_SceneObjMgr.TryGetSkillSoundInfo(sobjInfo.Id);
            if (soundInfo != null)
            {
                TriggerImpl.PlaySoundAtPos(soundInfo, targetPos);
            }
        }
        else
        {
            Debug.Log("Trigger_PlaySoundAtPosBySoundId null");
        }
    }
示例#3
0
    private void DropWeapon(WeaponHand type)
    {
        if (m_Weapons.ContainsKey(type))
        {
            GameObject weapon = m_Weapons[type];
            Script_Util.DetachGameObject(weapon);
            GameObject.DestroyObject(weapon);
            m_Weapons.Remove(type);
        }

        // Make Sure Remove All Children
        Transform t = LogicSystem.FindChildRecursive(this.gameObject.transform, GetBoneName(type));

        if (t != null)
        {
            int childCount = t.childCount;
            for (int index = 0; index < childCount; index++)
            {
                Transform child = t.GetChild(index);
                child.parent = null;
                GameObject.Destroy(child.gameObject);
            }
            t.DetachChildren();
        }
    }
    private List <GameObject> FindTarget(Vector3 pos, float range, int mask)
    {
        List <GameObject> targetInfos = new List <GameObject>();

        Collider[] hitColliders = Physics.OverlapSphere(pos, range, mask);
        int        index        = 0;

        while (index < hitColliders.Length)
        {
            if (hitColliders[index] == null || hitColliders[index].gameObject == null)
            {
                index++;
                continue;
            }

            GameObject target = hitColliders[index].gameObject;
            if (target != null)
            {
                if (Script_Util.IsChildGameObject(GetAttacker(), target.GetInstanceID()))
                {
                    index++;
                    continue;
                }
                targetInfos.Add(target);
            }
            index++;
        }
        return(targetInfos);
    }
示例#5
0
    private void ExecuteMoveInternal(float delta, Vector3 gravity)
    {
        m_Velocity += delta * gravity;
        Vector3   tVelocity  = m_Target.transform.rotation * m_Velocity;
        Vector3   posOff     = tVelocity * delta;
        Vector3   pos        = m_Target.transform.position + posOff;
        Component controller = m_Target.GetComponent <CharacterController>();

        if (controller != null)
        {
            ((CharacterController)controller).Move(posOff);
        }
        else
        {
            m_Target.transform.position += posOff;
        }
        if (m_OnMovePos != null)
        {
            m_OnMovePos(pos, posOff);
        }
        float disWithGround = Script_Util.GetHeightWithGround(m_Target.transform);

        if (disWithGround <= 0 && m_OnHitGround != null)
        {
            m_OnHitGround(m_Target.transform.position, disWithGround);
        }
    }
    private void StartMove()
    {
        m_MoveDuration = 0;
        m_MoveElapsed  = 0;
        m_IsMoving     = true;

        Vector3 rayDirRevert = m_BulletInfo.MoveDir * (-1);
        Vector3 impactScrPos = m_BulletInfo.ImpactSrcPos + rayDirRevert * m_BulletInfo.MoveImpactRadius;
        Ray     ray          = new Ray(impactScrPos, m_BulletInfo.MoveDir);

        RaycastHit[] targetHitInfos = Physics.SphereCastAll(ray, m_BulletInfo.MoveImpactRadius,
                                                            m_BulletInfo.MoveDistanceMax);
        Script_Util.DrawPhysicsSphereCastLine(ray, m_BulletInfo.MoveDistanceMax, m_BulletInfo.MoveImpactRadius, Color.red, 10.0f);
        if (targetHitInfos != null && targetHitInfos.Length > 0)
        {
            Script_Util.SortRaycastHit(ref targetHitInfos);
            m_IsHit        = true;
            m_MoveHitInfo  = targetHitInfos[0];
            m_MoveDuration = m_MoveHitInfo.distance / m_BulletInfo.MoveSpeed;
            m_HitPos       = m_MoveHitInfo.point;
        }
        else
        {
            m_IsHit        = false;
            m_MoveDuration = m_BulletInfo.MoveDistanceMax / m_BulletInfo.MoveSpeed;
            m_HitPos       = Script_Util.CaculateRelativePos(m_BulletInfo.MoveStartPos,
                                                             m_BulletInfo.MoveDir, m_BulletInfo.MoveDistanceMax);
        }
    }
示例#7
0
 private void ApplyGravity(GameObject target, float delta, SkillAnimInfo animInfo)
 {
     if (target == null)
     {
         return;
     }
     if (!Script_Util.IsOnGround(target, GroundTweak))
     {
         StartControlGravity();
         m_Vertical += Gravity * delta;
         Vector3   posOff     = m_Vertical * delta;
         Vector3   pos        = target.transform.position + posOff;
         Component controller = target.GetComponent <CharacterController>();
         if (controller != null)
         {
             ((CharacterController)controller).Move(posOff);
         }
         else
         {
             target.transform.position += posOff;
         }
         LogicSystem.NotifyGfxUpdatePosition(target, pos.x, pos.y, pos.z);
     }
     else
     {
         EndControlGravity();
     }
 }
示例#8
0
 public NumericMovementInfo(string param)
 {
     string[] result = Script_Util.SplitParam(param, 2);
     if (result != null)
     {
         Speed      = Convert.ToSingle(result[0]);
         Accelerate = Convert.ToSingle(result[1]);
     }
 }
示例#9
0
 public SkillAnimProcedureInfo(string param)
 {
     string[] result = Script_Util.SplitParam(param, 3);
     if (result != null)
     {
         Duration = Convert.ToSingle(result[0]);
         BoneName = result[1];
         AnimName = result[2];
     }
 }
示例#10
0
    public Vector3 ExtractVector3(int index)
    {
        string ret = ExtractString(index);

        if (!string.IsNullOrEmpty(ret))
        {
            return(Script_Util.ToVector3(ret));
        }
        return(Vector3.zero);
    }
示例#11
0
    public static void ProcessVerticalImpact(GameObject attacker, GameObject sender,
                                             SkillImpactInfos impacts, float verticalHeight = 10.0f, float verticalHeightStart = 0.0f,
                                             float SectorDegree = 360.0f, int hitCount = 1)
    {
        bool isTargeted = false;
        // Find Targets
        Ray ray = new Ray(
            sender.transform.position + new Vector3(0, verticalHeightStart - impacts.ImpactRadius, 0),
            Vector3.up);

        RaycastHit[] targetHitInfos = Physics.SphereCastAll(ray, impacts.ImpactRadius,
                                                            verticalHeight, (int)SceneLayerType.Character);
        Script_Util.DrawPhysicsSphereCastLine(ray, verticalHeight, impacts.ImpactRadius, Color.red, 10.0f);
        int index = 0;

        while (index < targetHitInfos.Length)
        {
            if (targetHitInfos[index].collider == null || targetHitInfos[index].collider.gameObject == null)
            {
                index++;
                continue;
            }

            GameObject target = targetHitInfos[index].collider.gameObject;
            if (target != null)
            {
                Vector3 targetDir = target.transform.position - sender.transform.position;
                targetDir.y = 0;
                Vector3 senderDir = sender.transform.rotation * Vector3.forward;
                if (Mathf.Abs(Vector3.Angle(targetDir, senderDir)) > SectorDegree)
                {
                    index++;
                    continue;
                }

                ImpactInfo curImpact = ExtractBestImpactInfo(target, impacts);
                if (curImpact != null)
                {
                    Vector3 faceDir = target.transform.position - sender.transform.position;
                    faceDir.y = 0;
                    ImpactInfo m_ImpactInfo = curImpact.Clone() as ImpactInfo;
                    m_ImpactInfo.m_Velocity = Quaternion.LookRotation(faceDir)
                                              * m_ImpactInfo.m_Velocity;
                    m_ImpactInfo.Attacker = sender;
                    ImpactSystem.Instance.SendImpact(attacker, target, m_ImpactInfo, hitCount);
                    TriggerImpl.RecordTarget(attacker, target);
                    isTargeted = true;
                }
            }
            index++;
        }
        ProcessImpactLock(attacker, impacts, isTargeted);
    }
示例#12
0
    private void HoldWeapon(WeaponHand type, SkillWeaponInfo info)
    {
        GameObject newWeapon = CreateNewWeapon(info);

        if (newWeapon != null)
        {
#if SHOOTER_LOG
            Debug.Log("HoldWeapon:" + newWeapon.name);
#endif
            m_Weapons.Add(info.HoldType, newWeapon);
            Script_Util.AttachGameObject(this.gameObject, newWeapon, GetBoneName(info.HoldType));
        }
    }
示例#13
0
    private void AdjustTargetPos()
    {
        float   weaponHeight    = TriggerImpl.GetWeaponHeight(this.gameObject);
        Vector3 adjustTargetPos = Script_Util.AdjustTargetPos(
            this.gameObject.transform,
            TargetPos,
            Camera.main.transform,
            weaponHeight,
            GunRotate);

        //Debug.Log(string.Format("AdjustTargetPos TargetPos:{0} adjustTargetPos:{1} weaponHeight:{2}",
        //  TargetPos, adjustTargetPos, weaponHeight));
        TriggerImpl.SetFacePos(this.gameObject, adjustTargetPos, YRotateRange);
    }
示例#14
0
    private GameObject CreateNewWeapon(SkillWeaponInfo info)
    {
        GameObject tWeaponObj = null;

        if (info.WeaponAsset != null)
        {
            tWeaponObj = Script_Util.CreateGameObjectByAsset(info.WeaponAsset);
        }
        else
        {
            tWeaponObj = Script_Util.CreateGameObjectByName(info.WeaponName);
        }
        return(tWeaponObj);
    }
    private void StartMove()
    {
        Ray ray = new Ray(m_BulletInfo.MoveStartPos, m_BulletInfo.MoveDir);

        if (Physics.Raycast(ray, out m_MoveHitInfo, m_BulletInfo.MoveDistanceMax, (int)SceneLayerType.SceneStatic))
        {
            m_IsHit  = true;
            m_HitPos = m_MoveHitInfo.point;
        }
        else
        {
            m_IsHit  = false;
            m_HitPos = Script_Util.CaculateRelativePos(m_BulletInfo.MoveStartPos,
                                                       m_BulletInfo.MoveDir, m_BulletInfo.MoveDistanceMax);
        }
    }
 private void ProcessMove()
 {
     if (m_IsMoving)
     {
         m_MoveElapsed += Time.deltaTime;
         if (m_MoveElapsed < m_MoveDuration)
         {
             Vector3 curPos = Script_Util.CaculateFlyPos(m_BulletInfo.MoveStartPos,
                                                         m_BulletInfo.MoveDir, m_BulletInfo.MoveSpeed, m_MoveElapsed);
             gameObject.transform.position = curPos;
         }
         else
         {
             StopMove();
         }
     }
 }
示例#17
0
 public SkillMovementInfo(string param)
 {
     string[] result = Script_Util.SplitParam(param, 1);
     if (result != null)
     {
         Id               = Convert.ToInt32(result[0]);
         MoveTimeMax      = Convert.ToSingle(result[1]);
         ForwardInfo      = new NumericMovementInfo(result[2]);
         UpwardInfo       = new NumericMovementInfo(result[3]);
         SidewardInfo     = new NumericMovementInfo(result[4]);
         Gravity          = Script_Util.ToVector3(result[5]);
         IsAppendVelocity = Convert.ToBoolean(result[6]);
     }
     else
     {
         IsValid = false;
     }
 }
    private List <RaycastHit> CheckTarget(List <RaycastHit> hitInfos, SkillImpactInfos impact)
    {
        List <RaycastHit> retInfos = new List <RaycastHit>();

        foreach (RaycastHit hitinfo in hitInfos)
        {
            GameObject target = hitinfo.transform.gameObject;
            if (Script_Util.IsChildGameObject(GetAttacker(), target.GetInstanceID()))
            {
                continue;
            }
            if (TriggerImpl.CheckTargetInImpactExcept(target, impact))
            {
                continue;
            }
            retInfos.Add(hitinfo);
        }
        return(retInfos);
    }
示例#19
0
 public SkillSceneObjInfo(string param)
 {
     string[] result = Script_Util.SplitParam(param, 1);
     if (result != null)
     {
         Id = Convert.ToInt32(result[0]);
         if (result.Length > 1)
         {
             for (int index = 1; index < result.Length; index++)
             {
                 paramOther.Add(result[index]);
             }
         }
     }
     else
     {
         IsValid = false;
     }
 }
示例#20
0
 public SkillWeaponInfo(string param)
 {
     string[] result = Script_Util.SplitParam(param, 6);
     if (result != null)
     {
         Id             = Convert.ToInt32(result[0]);
         WeaponName     = result[1];
         Operate        = (WeaponCmd)Convert.ToInt32(result[2]);
         HoldType       = (WeaponHand)Convert.ToInt32(result[3]);
         IsCurWeapon    = Convert.ToBoolean(result[4]);
         IsCurSubWeapon = Convert.ToBoolean(result[5]);
         if (result.Length > 6)
         {
             SpriteName = result[6];
         }
     }
     else
     {
         IsValid = false;
     }
 }
    private void ProcessImpact()
    {
        if (m_TargetHitInfos != null)
        {
            m_TargetHitInfos.Clear();
        }

        Vector3 rayDirRevert = m_BulletInfo.MoveDir * (-1);
        Vector3 impactScrPos = m_BulletInfo.ImpactSrcPos + rayDirRevert * m_BulletInfo.ImpactInfos.ImpactRadius;
        Ray     ray          = new Ray(impactScrPos, m_BulletInfo.MoveDir);
        float   distance     = (m_HitPos - m_BulletInfo.ImpactSrcPos).magnitude;

        RaycastHit[] targetHitInfos = Physics.SphereCastAll(ray, m_BulletInfo.ImpactInfos.ImpactRadius,
                                                            distance, (int)SceneLayerType.Character);
        Script_Util.DrawPhysicsSphereCastLine(ray, distance, m_BulletInfo.ImpactInfos.ImpactRadius, Color.red, 10.0f);
        if (targetHitInfos != null && targetHitInfos.Length > 0)
        {
            m_TargetHitInfos = new List <RaycastHit>(targetHitInfos);
            m_TargetHitInfos = CheckTarget(m_TargetHitInfos, m_BulletInfo.ImpactInfos);
            foreach (RaycastHit hitInfo in m_TargetHitInfos)
            {
                GameObject target = hitInfo.transform.gameObject;
                if (target != null)
                {
                    ImpactInfo tImpactInfo = TriggerImpl.ExtractBestImpactInfo(target, m_BulletInfo.ImpactInfos);
                    if (tImpactInfo != null)
                    {
                        tImpactInfo = tImpactInfo.Clone() as ImpactInfo;
                        Script_Util.AdjustImpactEffectDataPos(target, GetAttacker(), tImpactInfo, hitInfo.point, m_BulletInfo.MoveDir);
                        Vector3 faceDir = m_BulletInfo.MoveDir;
                        faceDir.y = 0;
                        tImpactInfo.m_Velocity = Quaternion.LookRotation(faceDir) * tImpactInfo.m_Velocity;
                        tImpactInfo.Attacker   = GetAttacker();
                        ImpactSystem.Instance.SendImpact(GetAttacker(), target, tImpactInfo);
                        TriggerImpl.RecordTarget(GetAttacker(), target);
                    }
                }
            }
        }
    }
示例#22
0
    //////////////////////////////////////////////////////////////////////////
    // Effect
    public static GameObject PlayEffect(SkillEffectInfo info)
    {
        GameObject tEffectObj = null;

        if (info.EffectAsset != null)
        {
            tEffectObj = Script_Util.CreateGameObjectByAsset(info.EffectAsset);
        }
        else
        {
            tEffectObj = Script_Util.CreateGameObjectByName(info.EffectName);
        }

        if (tEffectObj != null)
        {
            tEffectObj.transform.rotation = Quaternion.Euler(info.EffectRot);
            tEffectObj.transform.position = info.EffectPos;
            if (tEffectObj.particleSystem != null)
            {
                tEffectObj.particleSystem.Play(true);
            }
            if (OnGetSkillSoundInfo != null)
            {
                SkillSoundInfo sInfo = OnGetSkillSoundInfo(info.EffectSoundId);
                if (sInfo != null)
                {
                    TriggerImpl.PlaySoundAtTarget(tEffectObj, sInfo);
                }
            }
            GameObject.Destroy(tEffectObj, Script_Util.ForceNotifyEffectTime(info.EffectLiftTime));
        }
        else
        {
            LogicSystem.GfxLog("PlayEffect create failed!");
        }
        return(tEffectObj);
    }
示例#23
0
    /// param:Id[对应到SkillSceneObjManager中的AttractBullet Id]
    /// example:1
    public void Trigger_AttractShoot(string param)
    {
#if SHOOTER_LOG
        Debug.Log("Trigger_AttractShoot param:" + param);
#endif
        if (m_SceneObjMgr != null)
        {
            SkillSceneObjInfo             sobjInfo   = new SkillSceneObjInfo(param);
            SceneObject_AttractBulletInfo bulletInfo = m_SceneObjMgr.TryGetAttractBulletInfo(sobjInfo.Id);
            MasterWeaponType masterType    = (MasterWeaponType)(sobjInfo.ExtractNumeric <int>(0, 0));
            GameObject       curMainWeapon = TriggerImpl.GetCurMainWeapon(this.gameObject, masterType);
            if (bulletInfo != null && bulletInfo.SceneObjInfo != null && curMainWeapon != null)
            {
                Transform efSpark = LogicSystem.FindChildRecursive(curMainWeapon.transform,
                                                                   Script_Util.ForceNotifyEffectBone(bulletInfo.SceneObjInfo.EffectParentBone));
                if (null == efSpark)
                {
                    Debug.Log("Trigger_AttractShoot bone miss!");
                    return;
                }
                bulletInfo          = bulletInfo.Clone();
                bulletInfo.Attacker = this.gameObject;
                bulletInfo.SceneObjInfo.EffectPos += efSpark.transform.position;
                bulletInfo.MoveStartPos           += efSpark.transform.position;
                bulletInfo.MoveDir = Quaternion.Euler(efSpark.transform.rotation.eulerAngles + bulletInfo.MoveDir) * Vector3.forward;
                bulletInfo.SceneObjInfo.EffectLiftTime = float.MaxValue;
                bulletInfo.ImpactSrcPos += new Vector3(gameObject.transform.position.x,
                                                       efSpark.transform.position.y, gameObject.transform.position.z);
                GameObject tBulletObj = TriggerImpl.PlayEffect(bulletInfo.SceneObjInfo);
                tBulletObj.SendMessage("Active", bulletInfo);
            }
            else
            {
                Debug.Log("Trigger_AttractShoot null!");
            }
        }
    }
示例#24
0
    public static GameObject AttachEffectDirect(SkillEffectInfo info)
    {
        GameObject tEffectObj = null;

        if (info.EffectAsset != null)
        {
            tEffectObj = Script_Util.CreateGameObjectByAsset(info.EffectAsset);
        }
        else
        {
            tEffectObj = Script_Util.CreateGameObjectByName(info.EffectName);
        }
        if (null != tEffectObj)
        {
            bool ret = Script_Util.AttachGameObjectDirect(info.EffectParent, tEffectObj.transform);
            if (ret)
            {
                tEffectObj.transform.localPosition = info.EffectPos;
                tEffectObj.transform.localRotation = Quaternion.Euler(info.EffectRot);
            }
            if (OnGetSkillSoundInfo != null)
            {
                SkillSoundInfo sInfo = OnGetSkillSoundInfo(info.EffectSoundId);
                if (sInfo != null)
                {
                    TriggerImpl.PlaySoundAtTarget(tEffectObj, sInfo);
                }
            }
            GameObject.Destroy(tEffectObj, Script_Util.ForceNotifyEffectTime(info.EffectLiftTime));
        }
        else
        {
            LogicSystem.GfxLog("AttachEffect effect create failed!");
        }
        return(tEffectObj);
    }
示例#25
0
 public SkillEffectInfo(string param)
 {
     string[] result = Script_Util.SplitParam(param, 1);
     if (result != null)
     {
         Id = Convert.ToInt32(result[0]);
         if (result.Length >= 2)
         {
             EffectName = result[1];
         }
         if (result.Length >= 3)
         {
             EffectLiftTime = Convert.ToSingle(result[2]);
         }
         if (result.Length >= 4)
         {
             EffectPos = Script_Util.ToVector3(result[3]);
         }
         if (result.Length >= 5)
         {
             EffectRot = Script_Util.ToVector3(result[4]);
         }
         if (result.Length >= 6)
         {
             EffectParentBone = result[5];
         }
         if (result.Length >= 7)
         {
             EffectSoundId = Convert.ToInt32(result[6]);
         }
     }
     else
     {
         IsValid = false;
     }
 }