コード例 #1
0
        protected override int OnExecute(BtWorkingData workData)
        {
            // 1.得到目标坐标target_pos
            Vector3 targetPos = Vector3.zero;
            // 2.当前坐标current_pos
            Vector3 currentPos = Vector3.zero;
            // 3.距离目标的距离是否小于一定程度
            float distToTarget = MathHelper.Distance2D(targetPos, currentPos);

            if (distToTarget < MIN_DISTANCE)
            {
                return(BtRunningStatus.FINISHED);
            }
            else
            {
                int ret = BtRunningStatus.EXECUTING;
                // 下一步移动的距离
                float moveingStep = 0;
                if (moveingStep > distToTarget)
                {
                    ret = BtRunningStatus.FINISHED;
                }
                // 实际移动
                return(ret);
            }
        }
コード例 #2
0
 protected override int OnExecute(BtWorkingData workData)
 {
     /*AIEntityWorkingData this_data = work_data.As<AIEntityWorkingData>();
      * Vector3 target_pos = TMathUtils.Vector3ZeroY(this_data.EntityAi.GetBbValue<Vector3>(BtEntityAi.BBKEY_NEXTMOVINGPOSITION, Vector3.zero));
      * Vector3 current_pos = TMathUtils.Vector3ZeroY(this_data.EntityTrans.position);
      * if (TMathUtils.IsZero((target_pos - current_pos).sqrMagnitude))
      * {
      *  return BtRunningStatus.FINISHED;
      * }
      * else
      * {
      *  Vector3 to_target = TMathUtils.GetDirection2D(target_pos, current_pos);
      *  Vector3 cur_facing = this_data.EntityTrans.forward;
      *  float dot_v = Vector3.Dot(to_target, cur_facing);
      *  float delta_angle = Mathf.Acos(Mathf.Clamp(dot_v, -1f, 1f));
      *  if (delta_angle < 0.1f)
      *  {
      *      this_data.EntityTrans.forward = to_target;
      *      return BtRunningStatus.FINISHED;
      *  }
      *  else
      *  {
      *      Vector3 cross_v = Vector3.Cross(cur_facing, to_target);
      *      float angle_to_turn = Mathf.Min(3f * this_data.DeltaTime, delta_angle);
      *      if (cross_v.y < 0)
      *      {
      *          angle_to_turn = -angle_to_turn;
      *      }
      *      this_data.EntityTrans.Rotate(Vector3.up, angle_to_turn * Mathf.Rad2Deg, Space.World);
      *  }
      * }*/
     return(BtRunningStatus.FINISHED);
 }
コード例 #3
0
        protected override bool OnEvaluate(BtWorkingData workData)
        {
            BtActionParallelContext thisContext = GetContext <BtActionParallelContext>(workData);

            _init_list_to(thisContext._evaluationStatus, false);
            bool finalResult = false;

            for (int i = 0; i < GetChildCount(); ++i)
            {
                BtAction node = GetChild <BtAction>(i);
                bool     ret  = node.Evaluate(workData);
                //early break
                if (_evaluationRelationship == E_ChildrenRelationShip.and && ret == false)
                {
                    finalResult = false;
                    break;
                }
                if (ret)
                {
                    finalResult = true;
                }
                thisContext._evaluationStatus[i] = ret;
            }
            return(finalResult);
        }
コード例 #4
0
        protected override void OnEnter(BtWorkingData workData)
        {
            AIEntityWorkingData thisData = workData.As <AIEntityWorkingData>();
            UserContextData     userData = GetUserContextData <UserContextData>(workData);

            userData._attackingTime = DefaultWaitingTime;

            Debug.Log("进入攻击状态,设定Target");
            //this_data.EntityAnimator.CrossFade("attack", 0.2f);
        }
コード例 #5
0
        protected override void OnTransition(BtWorkingData workData)
        {
            BtActionParallelContext thisContext = GetContext <BtActionParallelContext>(workData);

            for (int i = 0; i < GetChildCount(); ++i)
            {
                BtAction node = GetChild <BtAction>(i);
                node.Transition(workData);
            }
            //clear running status
            _init_list_to(thisContext._runningStatus, BtRunningStatus.EXECUTING);
        }
コード例 #6
0
        protected override int OnExecute(BtWorkingData workData)
        {
            AIEntityWorkingData thisData = workData.As <AIEntityWorkingData>();
            UserContextData     userData = GetUserContextData <UserContextData>(workData);

            if (userData._attackingTime > 0)
            {
                userData._attackingTime -= thisData.DeltaTime;
                if (userData._attackingTime <= 0)
                {
                    Debug.Log("再一次攻击");
                    //this_data.EntityAnimator.CrossFade(ending_anim[Random.Range(0, ending_anim.Length)], 0.2f);
                }
            }
            return(BtRunningStatus.EXECUTING);
        }
コード例 #7
0
        protected override int OnUpdate(BtWorkingData workData)
        {
            BtActionParallelContext thisContext = GetContext <BtActionParallelContext>(workData);

            //first time initialization
            if (thisContext._runningStatus.Count != GetChildCount())
            {
                _init_list_to(thisContext._runningStatus, BtRunningStatus.EXECUTING);
            }
            bool hasFinished  = false;
            bool hasExecuting = false;

            for (int i = 0; i < GetChildCount(); ++i)
            {
                if (thisContext._evaluationStatus[i] == false)
                {
                    continue;
                }
                if (BtRunningStatus.IsFinished(thisContext._runningStatus[i]))
                {
                    hasFinished = true;
                    continue;
                }
                BtAction node          = GetChild <BtAction>(i);
                int      runningStatus = node.Update(workData);
                if (BtRunningStatus.IsFinished(runningStatus))
                {
                    hasFinished = true;
                }
                else
                {
                    hasExecuting = true;
                }
                thisContext._runningStatus[i] = runningStatus;
            }
            if (_runningstatusRelationship == E_ChildrenRelationShip.or && hasFinished || _runningstatusRelationship == E_ChildrenRelationShip.and && hasExecuting == false)
            {
                _init_list_to(thisContext._runningStatus, BtRunningStatus.EXECUTING);
                return(BtRunningStatus.FINISHED);
            }
            return(BtRunningStatus.EXECUTING);
        }
コード例 #8
0
 protected override void OnEnter(BtWorkingData workData)
 {
     AIEntityWorkingData this_data = workData.As <AIEntityWorkingData>();
 }
コード例 #9
0
 protected override void OnEnter(BtWorkingData workData)
 {
     //AIEntityWorkingData working = work_data.As<AIEntityWorkingData>();
     UnityEngine.Debug.Log("播放移动动作");
     // 播放移动动作
 }