private void ConstructBehahaviourTree() { IsCoverAvailableNode isCoverAvaliableNode = new IsCoverAvailableNode(avaliableCovers, playerTransform, this); GoToCoverNode goToCoverNode = new GoToCoverNode(agent, this); HealthNode healthNode = new HealthNode(this, lowHealthThreshold); IsCoveredNode isCoveredNode = new IsCoveredNode(playerTransform, transform); ChaseNode chaseNode = new ChaseNode(playerTransform, agent, this); RangeNode chasingRangeNode = new RangeNode(chasingRange, playerTransform, transform); RangeNode shootingRangeNode = new RangeNode(shootingRange, playerTransform, transform); ShootNode shootNode = new ShootNode(agent, this, playerTransform); Sequence chaseSequence = new Sequence(new List <Node> { chasingRangeNode, chaseNode }); Sequence shootSequence = new Sequence(new List <Node> { shootingRangeNode, shootNode }); Sequence goToCoverSequence = new Sequence(new List <Node> { isCoverAvaliableNode, goToCoverNode }); Selector findCoverSelector = new Selector(new List <Node> { goToCoverSequence, chaseSequence }); Selector tryToTakeCoverSelector = new Selector(new List <Node> { isCoveredNode, findCoverSelector }); Sequence mainCoverSequence = new Sequence(new List <Node> { healthNode, tryToTakeCoverSelector }); topNode = new Selector(new List <Node> { mainCoverSequence, shootSequence, chaseSequence }); }
private void ConstructBehaviourTree() { // Nodes var wonderNode = new WonderNode(_navMeshAgent, gameObject); var coverAvailableNode = new IsCoverAvailableNode(availableCovers, player.transform, this); var goToCoverNode = new GoToCoverNode(this, _navMeshAgent); var healthNode = new HealthNode(GetComponent <EnemyController>(), GetComponent <EnemyController>().lowHealthThreshold); var isCoveredNode = new IsCoveredNode(player.transform, transform); var chaseNode = new ChaseNode(player.transform, _navMeshAgent); var wonderRangeNode = new NotInRangeNode(GetComponent <EnemyController>().chaseRange, player.transform, transform); var chasingRangeNode = new RangeNode(GetComponent <EnemyController>().chaseRange, player.transform, transform); var shootingRangeNode = new RangeNode(GetComponent <EnemyController>().shootRange, player.transform, transform); var shootNode = new ShootNode(_navMeshAgent, this); // Sequences var wonderSequence = new BTSequencer(new List <BTNode> { wonderRangeNode, wonderNode }); var chaseSequence = new BTSequencer(new List <BTNode> { chasingRangeNode, chaseNode }); var shootSequence = new BTSequencer(new List <BTNode> { shootingRangeNode, shootNode }); var goToCoverSequence = new BTSequencer(new List <BTNode> { coverAvailableNode, goToCoverNode }); var findCoverSelector = new BTSelector(new List <BTNode> { goToCoverSequence, chaseSequence }); var tryToTakeCoverSelector = new BTSelector(new List <BTNode> { isCoveredNode, findCoverSelector }); var mainCoverSequence = new BTSequencer(new List <BTNode> { healthNode, tryToTakeCoverSelector }); _rootNode = new BTSelector(new List <BTNode> { wonderSequence, mainCoverSequence, shootSequence, chaseSequence }); }
/// <summary> /// Author: Ziqi Li /// RPC function for shooting bullet /// </summary> //[PunRPC] //public void RPC_Shoot() //{ // GameObject bullet = Instantiate(Projectile, transform.position + transform.forward * 2.4f, Quaternion.identity); // bullet.GetComponent<Bullet>().owner = this.gameObject; // Modification made by Feiyang: Register the owner of the bullet to enable friendly fire // bullet.GetComponent<Rigidbody>().AddForce(transform.forward * (ProjectileSpeed * 100)); //} /// <summary> /// Author: Daniel Holker /// Constructs nodes and puts them together into a behaviour tree that determines its actions /// </summary> private void ConstructBehaviourTree() { WalkToPlayerNode WalkToPlayerNode = new WalkToPlayerNode(GetTarget, NearnessToPlayer, NavMeshAgent); WanderNode WanderNode = new WanderNode(WanderTarget, NavMeshAgent, WanderRange); TargetInRangeNode TargetInRangeNode = new TargetInRangeNode(ChasingRange, PlayerList, this.transform, SetTarget); ShootNode ShootNode = new ShootNode(Projectile, GetTarget, ProjectileSpeed, ShootCooldown, this.gameObject, this.AnimManager, this.AttackDelay); Inverter TargetNotInRange = new Inverter(TargetInRangeNode); Sequence AttackSequence = new Sequence(new List <Node> { WalkToPlayerNode, ShootNode }); Sequence ChaseSequence = new Sequence(new List <Node> { TargetInRangeNode, AttackSequence }); Sequence ReturnToWander = new Sequence(new List <Node> { TargetNotInRange, WanderNode }); RootNode = new Selector(new List <Node> { ChaseSequence, ReturnToWander }); }
/// <summary> /// Author: Ziqi Li /// RPC function for shooting bullet /// </summary> //[PunRPC] //public void RPC_Shoot() //{ // GameObject bullet = Instantiate(Projectile, transform.position + transform.forward * 2.5f, Quaternion.identity); // Debug.Log(bullet.transform); // bullet.GetComponent<Bullet>().owner = this.gameObject; // Modification made by Feiyang: Register the owner of the bullet to enable friendly fire // bullet.GetComponent<Rigidbody>().AddForce(transform.forward * (ProjectileSpeed * 100)); //} private void ConstructBehaviourTree() { ShootNode ShootNode = new ShootNode(Projectile, GetTarget, ProjectileSpeed, ShootCooldown, this.gameObject, AnimManager, this.AttackDelay); RootNode = ShootNode; }