// 檢查武器並移動 , 會檢查是在範圍內 還是不能發射 protected override bool CheckWeaponAndMoveToTarget( UnitData _unitData , UnitWeaponSystem _weaponSys , Vector3 _TargetPosition ) { string weaponInRange = "" ; Vector3 vecToTarget = Vector3.zero ; Vector3 norVecToTarget = Vector3.zero ; float angleOfTarget = 0.0f ; float dotOfUp = 0.0f ; string IMPLUSE_ENGINE_RATIO = ConstName.UnitDataComponentImpulseEngineRatio ; // 剛轉換過來不要檢查武器 if( m_State.ElapsedFromLast() > 0.5f ) { // check fire phaser weapon is available weaponInRange = _weaponSys.FindAbleToShootTargetWeaponComponent( RandomAWeaponKeyword() , m_TargetNow.Obj ) ; // Debug.Log( "weaponInRange=" + weaponInRange) ; if( 0 != weaponInRange.Length ) { this.SetState( AI_Fire_State.StopAndFireToTarget ) ; return true ; } } // move to target if( true == MathmaticFunc.FindTargetRelation( this.gameObject , _TargetPosition , ref vecToTarget , ref norVecToTarget , ref angleOfTarget , ref dotOfUp ) ) { if( true == _unitData.standardParameters.ContainsKey( IMPLUSE_ENGINE_RATIO ) ) { // speed to maximum if( vecToTarget.sqrMagnitude > m_MaximumWeaponRange * m_MaximumWeaponRange ) _unitData.standardParameters[ IMPLUSE_ENGINE_RATIO ].ToMax() ; else _unitData.standardParameters[ IMPLUSE_ENGINE_RATIO ].Clear() ; } // angular speed _unitData.AngularRatioHeadTo( angleOfTarget , dotOfUp , 0.1f ) ; } return false ; }
protected override void FireWeapon( UnitWeaponSystem _weaponSys , NamedObject _TargetUnit ) { if( true == GlobalSingleton.GetGlobalSingletonObj().GetComponent<AutoPlayMachine>().m_Active ) return ; string weaponComponent = "" ; string specifiedWeapon = RandomAWeaponKeyword() ; // 距離太遠 string weaponInRange = _weaponSys.FindAbleToShootTargetWeaponComponent( specifiedWeapon , _TargetUnit.Obj ) ; // Debug.Log( "weaponInRange=" + weaponInRange ) ; if( 0 == weaponInRange.Length ) { // no available weapon this.SetState( AI_Fire_State.MoveToTarget ) ; return ; } string weaponReady = _weaponSys.FindAbleToFireWeaponComponent( specifiedWeapon ) ; #if DEBUG Debug.Log( "FireWeapon() weaponReady=" + weaponReady ) ; #endif if( 0 == weaponReady.Length ) { // no available weapon this.SetState( AI_Fire_State.WaitForReload ) ; return ; } // 檢查正在reload weaponComponent = _weaponSys.FindAbleWeaponComponent( specifiedWeapon , _TargetUnit.Obj ) ; // Debug.Log( "weaponReady=" + weaponComponent ) ; if( 0 == weaponComponent.Length ) { // no available weapon this.SetState( AI_Fire_State.WaitForReload ) ; return ; } // Debug.Log( "_weaponSys.ActiveWeapon" ) ; // fire if( true == _weaponSys.ActiveWeapon( weaponComponent , _TargetUnit , ConstName.UnitDataComponentUnitIntagraty ) ) { this.SetState( AI_Fire_State.WaitForReload ) ; } }