Esempio n. 1
0
 public static PredatorCombatData EditCombat(string label,
                                             Predator3rdPersonalUnit Unit,
                                             PredatorCombatData Combat)
 {
     EditorGUILayout.LabelField(label);
     Combat.Name      = EditorGUILayout.TextField("Combat name:", Combat.Name);
     Combat.userInput = (UserInputType)EditorGUILayout.EnumPopup(new GUIContent("Gesture:", "The matched gesture trigger this combat?"), Combat.userInput);
     string[] AllAttackDataName = Unit.PredatorAttackData.Select(x => x.Name).ToArray();
     Combat.useAttackDataName = EditorCommon.EditStringArray("Use these attack data:", Combat.useAttackDataName, AllAttackDataName);
     EditorGUILayout.BeginHorizontal();
     Combat.WaitUntilAnimationReturn = EditorGUILayout.Toggle("Wait animation return:", Combat.WaitUntilAnimationReturn);
     Combat.BlockPlayerInput         = EditorGUILayout.Toggle("Block player input", Combat.BlockPlayerInput);
     EditorGUILayout.EndHorizontal();
     Combat.OverrideAttackData = EditorGUILayout.BeginToggleGroup(new GUIContent("Override attackData setting", "If true, some of the attack data property would be overrided"), Combat.OverrideAttackData);
     Combat.DamagePointBase    = EditorGUILayout.FloatField("DamagePoint base:", Combat.DamagePointBase);
     EditorGUILayout.BeginHorizontal();
     Combat.MinDamagePointBonus = EditorGUILayout.FloatField("Min damage bonus:", Combat.MinDamagePointBonus);
     Combat.MaxDamagePointBonus = EditorGUILayout.FloatField("Max damage bonus:", Combat.MaxDamagePointBonus);
     EditorGUILayout.EndHorizontal();
     Combat.CanDoCriticalAttack = EditorGUILayout.Toggle("Can do critical attack", Combat.CanDoCriticalAttack);
     if (Combat.CanDoCriticalAttack)
     {
         EditorGUILayout.BeginHorizontal();
         Combat.CriticalAttackChance    = EditorGUILayout.Slider("Critical chance:", Combat.CriticalAttackChance, 0, 1);
         Combat.CriticalAttackBonusRate = EditorGUILayout.FloatField("Critical bonus rate", Combat.CriticalAttackBonusRate);
         EditorGUILayout.EndHorizontal();
     }
     EditorGUILayout.EndToggleGroup();
     return(Combat);
 }
    public static PredatorCombatData EditCombat(string label,
		                            Predator3rdPersonalUnit Unit, 
		                            PredatorCombatData Combat)
    {
        EditorGUILayout.LabelField (label);
        Combat.Name = EditorGUILayout.TextField ("Combat name:", Combat.Name);
        Combat.userInput = (UserInputType)EditorGUILayout.EnumPopup (new GUIContent ("Gesture:", "The matched gesture trigger this combat?"), Combat.userInput);
        string[] AllAttackDataName = Unit.PredatorAttackData.Select(x=>x.Name).ToArray();
        Combat.useAttackDataName = EditorCommon.EditStringArray("Use these attack data:",Combat.useAttackDataName,AllAttackDataName);
        EditorGUILayout.BeginHorizontal ();
        Combat.WaitUntilAnimationReturn = EditorGUILayout.Toggle ("Wait animation return:", Combat.WaitUntilAnimationReturn);
        Combat.BlockPlayerInput = EditorGUILayout.Toggle ("Block player input", Combat.BlockPlayerInput);
        EditorGUILayout.EndHorizontal ();
        Combat.OverrideAttackData = EditorGUILayout.BeginToggleGroup(new GUIContent("Override attackData setting", "If true, some of the attack data property would be overrided"), Combat.OverrideAttackData);
        Combat.DamagePointBase = EditorGUILayout.FloatField("DamagePoint base:",Combat.DamagePointBase);
        EditorGUILayout.BeginHorizontal();
        Combat.MinDamagePointBonus = EditorGUILayout.FloatField("Min damage bonus:",Combat.MinDamagePointBonus);
        Combat.MaxDamagePointBonus = EditorGUILayout.FloatField("Max damage bonus:",Combat.MaxDamagePointBonus);
        EditorGUILayout.EndHorizontal();
        Combat.CanDoCriticalAttack = EditorGUILayout.Toggle("Can do critical attack", Combat.CanDoCriticalAttack);
        if(Combat.CanDoCriticalAttack)
        {
            EditorGUILayout.BeginHorizontal();
            Combat.CriticalAttackChance = EditorGUILayout.Slider("Critical chance:", Combat.CriticalAttackChance, 0, 1);
            Combat.CriticalAttackBonusRate = EditorGUILayout.FloatField("Critical bonus rate", Combat.CriticalAttackBonusRate);
            EditorGUILayout.EndHorizontal();
        }
        EditorGUILayout.EndToggleGroup();
        return Combat;
    }
Esempio n. 3
0
    /// <summary>
    /// Process a PredatorCombatData and perform attack behavior.
    /// </summary>
    /// <param name="combat"></param>
    /// <returns></returns>
    IEnumerator DoCombat(PredatorCombatData combat)
    {
        string useAttackDataName            = Util.RandomFromArray <string>(combat.useAttackDataName);
        PredatorPlayerAttackData attackData = this.PredatorPlayerUnit.PredatorAttackDataDict[useAttackDataName];

        if (combat.OverrideAttackData)
        {
            attackData = attackData.GetClone() as PredatorPlayerAttackData;
            attackData.DamagePointBase         = combat.DamagePointBase;
            attackData.MinDamageBonus          = combat.MinDamagePointBonus;
            attackData.MaxDamageBonus          = combat.MaxDamagePointBonus;
            attackData.CanDoCriticalAttack     = combat.CanDoCriticalAttack;
            attackData.CriticalAttackBonusRate = combat.CriticalAttackBonusRate;
            attackData.CriticalAttackChance    = combat.CriticalAttackChance;
        }
        currentProcessCombat = combat;
        //If combat.BlockUserInput = TRUE, user gesture input will be dropped during combat processing
        if (combat.BlockPlayerInput == true)
        {
            ReleaseUserInputBlockTime = Time.time + animation[attackData.AnimationName].length * 0.5f;
            BlockUserGestureInput     = true;
        }

        //Look for enemy - in near radius
        float DistanceToEnemy = 0;

        CurrentTarget = FindTarget(transform.forward, RushRadius, out DistanceToEnemy);

//		Debug.Log(string.Format("Find the target:{0}, enemy distance:{1}, AttackableRange:{2}", CurrentTarget,DistanceToEnemy,attackData.AttackableRange) );

        if (CurrentTarget != null)
        {
            Util.RotateToward(transform, CurrentTarget.transform.position, false, 0);
            //if target farer than attack attackableRange, rush to the target.
            if (DistanceToEnemy > attackData.AttackableRange)
            {
                yield return(StartCoroutine(RushTo(CurrentTarget.transform, 0.3f)));
            }
            //if attackData.hitTriggerType = ByTime, means the message should be sent N seconds after animation.
            //else if attackData.hitTriggerType = ByEvent, the message should be triggered by animation event.
            if (attackData.hitTriggerType == HitTriggerType.ByTime)
            {
                StartCoroutine(SendHitMessage(attackData, CurrentTarget));
            }
        }
        animation.CrossFade(attackData.AnimationName);
        if (combat.FinalCombat)
        {
            Invoke("ClearUnprocessCombatList", animation[attackData.AnimationName].length * 0.5f);
        }
        if (combat.WaitUntilAnimationReturn)
        {
            yield return(new WaitForSeconds(animation[attackData.AnimationName].length));
        }
        else
        {
            yield return(new WaitForSeconds(CombatCooldown));
        }
    }
Esempio n. 4
0
    void Awake()
    {
        controller         = this.GetComponent <CharacterController> ();
        predatorStatus     = GetComponent <PredatorPlayerStatus> ();
        PredatorPlayerUnit = GetComponent <Predator3rdPersonalUnit> ();
        EnemyLayer         = PredatorPlayerUnit.EnemyLayer;
        RushRadius         = PredatorPlayerUnit.RushRadius;
        CombatCooldown     = PredatorPlayerUnit.CombatCoolDown;

        DefaultCombat_LeftClaw  = PredatorPlayerUnit.DefaultCombat_LeftClaw;
        DefaultCombat_RightClaw = PredatorPlayerUnit.DefaultCombat_RightClaw;
        DefaultCombat_DualClaw  = PredatorPlayerUnit.DefaultCombat_DualClaw;
        ComboCombats            = PredatorPlayerUnit.ComboCombat;
        foreach (PredatorComboCombat comboCombat in ComboCombats)
        {
            comboCombat.Init();
            ComboCombatTokenDict [comboCombat.token] = comboCombat;
        }
    }
Esempio n. 5
0
    /// <summary>
    /// Call by GestureHandler.
    /// 1. New HUD Hint
    /// 2. Search combo combat by playerComboToken
    /// 3. Determine the playerCombo can go ahead , or terminated(unmatched)
    /// Put a new user gesture into queue - UnprocessGestureList
    /// </summary>
    /// <param name="gestureInfo"></param>
    public void NewUserGesture(UserInputData gestureInfo)
    {
        if (!BlockUserGestureInput)
        {
            //Accumulate player combo token string
            playerComboToken += ((int)gestureInfo.Type).ToString();
            UserInputType[] nextCombat = PredictNextMatchedCombo(playerComboToken);
            SendMessage("ShowButtonHints", nextCombat);
//			Debug.Log("Current playerComboToken:" + playerComboToken);

            //Check if player combo token has a matched prefab
            bool playerTokenMatched = false, isLastCombat = false;
            PredatorCombatData combat = GetComboCombatByToken(playerComboToken, gestureInfo.Type, out playerTokenMatched, out isLastCombat);
            if (combat == null)
            {
                return;
            }
            //If player combo token not matched, set BlockUserGestureInput = true to block all player input,
            //until the combat processing finish, then BlockUserGestureInput will be set true again.
            //reset playerComboToken
            if (playerTokenMatched == false)
            {
                combat.FinalCombat    = true;
                BlockUserGestureInput = true;
                playerComboToken      = "";
            }
            else if (isLastCombat && playerTokenMatched)
            {
                combat.FinalCombat = true;
                playerComboToken   = "";
            }
            //record the last receiving player gesture input time
            LastProcessPlayerGestureInputTime = Time.time;
            // UnprocessGestureList.Add(gestureInfo);
            UnprocessCombatList.Add(combat);
        }
        else
        {
            Debug.Log("Input was dropped at frame:" + Time.frameCount);
        }
    }
Esempio n. 6
0
    /// <summary>
    /// Daemon  routine, check if UnprocessCombatList contains element, then processing it.
    /// </summary>
    /// <returns></returns>
    IEnumerator RepeatCheckCombatList()
    {
        while (true)
        {
            if (UnprocessCombatList.Count > 0)
            {
                PredatorCombatData combat = UnprocessCombatList [0];
                UnprocessCombatList.Remove(combat);
                //New Hint in GUI (HUD)
                PredatorPlayerUnit.HUDObject.SendMessage("NewHint", combat.userInput);
                yield return(StartCoroutine(DoCombat(combat)));

                if (combat.FinalCombat)
                {
                    BlockUserGestureInput = false;
                    PredatorPlayerUnit.HUDObject.SendMessage("ClearHint");
                    SendMessage("DontHint");
                }
            }
            yield return(null);
        }
    }
Esempio n. 7
0
 public static PredatorCombatData[] EditCombatDataArray(Predator3rdPersonalUnit Unit,
                                                        PredatorCombatData[] CombatArray)
 {
     if (GUILayout.Button("Add Combat"))
     {
         PredatorCombatData Combat = new PredatorCombatData();
         CombatArray = Util.AddToArray <PredatorCombatData> (Combat, CombatArray);
     }
     if (CombatArray != null)
     {
         for (int i = 0; i < CombatArray.Length; i++)
         {
             PredatorCombatData Combat = CombatArray [i];
             Combat = EditCombat("--- Edit combat:" + Combat.Name, Unit, Combat);
             if (GUILayout.Button("Delete combat:" + Combat.Name))
             {
                 CombatArray = Util.CloneExcept <PredatorCombatData> (CombatArray, Combat);
             }
             EditorGUILayout.Space();
         }
     }
     return(CombatArray);
 }
    /// <summary>
    /// Process a PredatorCombatData and perform attack behavior.
    /// </summary>
    /// <param name="combat"></param>
    /// <returns></returns>
    IEnumerator DoCombat(PredatorCombatData combat)
    {
        string useAttackDataName = Util.RandomFromArray<string>(combat.useAttackDataName);
        PredatorPlayerAttackData attackData = this.PredatorPlayerUnit.PredatorAttackDataDict[useAttackDataName];
        if(combat.OverrideAttackData)
        {
            attackData = attackData.GetClone() as PredatorPlayerAttackData;
            attackData.DamagePointBase = combat.DamagePointBase;
            attackData.MinDamageBonus = combat.MinDamagePointBonus;
            attackData.MaxDamageBonus = combat.MaxDamagePointBonus;
            attackData.CanDoCriticalAttack = combat.CanDoCriticalAttack;
            attackData.CriticalAttackBonusRate = combat.CriticalAttackBonusRate;
            attackData.CriticalAttackChance = combat.CriticalAttackChance;
        }
        currentProcessCombat = combat;
        //If combat.BlockUserInput = TRUE, user gesture input will be dropped during combat processing
        if (combat.BlockPlayerInput == true) {
            ReleaseUserInputBlockTime = Time.time + animation[attackData.AnimationName].length * 0.5f;
            BlockUserGestureInput = true;
        }

        //Look for enemy - in near radius
        float DistanceToEnemy = 0;
        CurrentTarget = FindTarget (transform.forward, RushRadius, out DistanceToEnemy);

        //		Debug.Log(string.Format("Find the target:{0}, enemy distance:{1}, AttackableRange:{2}", CurrentTarget,DistanceToEnemy,attackData.AttackableRange) );

        if (CurrentTarget != null) {
            Util.RotateToward (transform, CurrentTarget.transform.position, false, 0);
            //if target farer than attack attackableRange, rush to the target.
            if (DistanceToEnemy > attackData.AttackableRange) {
                yield return StartCoroutine(RushTo (CurrentTarget.transform,0.3f));
            }
            //if attackData.hitTriggerType = ByTime, means the message should be sent N seconds after animation.
            //else if attackData.hitTriggerType = ByEvent, the message should be triggered by animation event.
            if(attackData.hitTriggerType == HitTriggerType.ByTime)
            {
               StartCoroutine (SendHitMessage (attackData, CurrentTarget));
            }
        }
        animation.CrossFade (attackData.AnimationName);
        if(combat.FinalCombat)
        {
            Invoke("ClearUnprocessCombatList", animation[attackData.AnimationName].length * 0.5f);
        }
        if (combat.WaitUntilAnimationReturn) {
            yield return new WaitForSeconds(animation[attackData.AnimationName].length);
        }
        else
            yield return new WaitForSeconds(CombatCooldown);
    }
    void Awake()
    {
        controller = this.GetComponent<CharacterController> ();
        predatorStatus = GetComponent<PredatorPlayerStatus> ();
        PredatorPlayerUnit = GetComponent<Predator3rdPersonalUnit> ();
        EnemyLayer = PredatorPlayerUnit.EnemyLayer;
        RushRadius = PredatorPlayerUnit.RushRadius;
        CombatCooldown = PredatorPlayerUnit.CombatCoolDown;

        DefaultCombat_LeftClaw = PredatorPlayerUnit.DefaultCombat_LeftClaw;
        DefaultCombat_RightClaw = PredatorPlayerUnit.DefaultCombat_RightClaw;
        DefaultCombat_DualClaw = PredatorPlayerUnit.DefaultCombat_DualClaw;
        ComboCombats = PredatorPlayerUnit.ComboCombat;
        foreach (PredatorComboCombat comboCombat in ComboCombats) {
            comboCombat.Init ();
            ComboCombatTokenDict [comboCombat.token] = comboCombat;
        }
    }
    public static PredatorCombatData[] EditCombatDataArray(Predator3rdPersonalUnit Unit, 
		                                          PredatorCombatData[] CombatArray)
    {
        if (GUILayout.Button ("Add Combat")) {
            PredatorCombatData Combat = new PredatorCombatData ();
            CombatArray = Util.AddToArray<PredatorCombatData> (Combat, CombatArray);
        }
        if (CombatArray != null) {
            for (int i=0; i<CombatArray.Length; i++) {
                PredatorCombatData Combat = CombatArray [i];
                Combat = EditCombat ("--- Edit combat:" + Combat.Name, Unit, Combat);
                if (GUILayout.Button ("Delete combat:" + Combat.Name)) {
                    CombatArray = Util.CloneExcept<PredatorCombatData> (CombatArray, Combat);
                }
                EditorGUILayout.Space ();
            }
        }
        return CombatArray;
    }