private void Start() { photonview = this.transform.GetChild(0).GetComponent <PhotonView>(); PlayerObj.SetActive(true); //rvocontroller = GetComponentInChildren<Pathfinding.RVO.RVOController>(); seeker = GetComponentInChildren <Pathfinding.Seeker>(); aipath = GetComponentInChildren <Pathfinding.AIPath>(); funnelmodifier = GetComponentInChildren <Pathfinding.FunnelModifier>(); aidestinatonsetter = GetComponentInChildren <Pathfinding.AIDestinationSetter>(); playermouse = GetComponentInChildren <PlayerMouse>(); rigidbody = GetComponentInChildren <Rigidbody>(); WarFog = PlayerObj.GetComponent <FogOfWarEntity>(); forminimap = transform.GetChild(2).gameObject; astar_target = transform.GetChild(1).gameObject; splatmanager = transform.GetChild(0).GetChild(0).gameObject; rigidbody.isKinematic = true; WarFog.enabled = false; if (photonView.isMine) { PlayerObj.name = gameObject.name + "_" + PhotonNetwork.player.NickName; } else { PlayerObj.name = gameObject.name + photonView.owner.NickName; } SceneManager.activeSceneChanged += SceneLoaded; DontDestroyOnLoad(this); }
//private float retreatDistance = minimalDistance; //Дистанция отступления //public GameObject deathEffect; void Start() { rb = GetComponent <Rigidbody2D>(); _animatorController = GetComponent <Animator>(); myNewPosition = new Vector3(transform.position.x, transform.position.y, transform.position.z); //myStartPosition (myStartPosition = new Vector3(transform.position.x, transform.position.y, transform.position.z)); target = GameObject.FindGameObjectWithTag("Player").GetComponent <Transform>(); maxHealth = health; movementSpeed = startMovementSpeed; if (spellSummon != null || spell_1 != null || spell_2 != null) { specialEffect = GetComponent <SpecialEffect>(); } AILerp = this.GetComponent <Pathfinding.AILerp>(); Seeker = this.GetComponent <Pathfinding.Seeker>(); EnemyAIDest = this.GetComponent <Pathfinding.EnemyAIDest>(); elementsAndEffects = this.GetComponent <ElementsAndEffects>(); //Для WalkingAndWander //waitTime = startWaitTime; //minX = transform.position.x - walkingRange; //maxX = transform.position.x + walkingRange; //minY = transform.position.y - walkingRange; //maxY = transform.position.y + walkingRange; }
private void ScanForTarget() { Collider2D[] colliders = Physics2D.OverlapCircleAll(transform.position, range); if (colliders.Length > 0) { GameObject HighestPriority = null; // priority is based on the lowest amount of nodes left to travel. int LowestValue = 99999; // amount of nodes that should be impossible to reach foreach (Collider2D collider in colliders) { if (collider.CompareTag("Enemy")) // all enemies should have a pathfinder.seeker component. { Pathfinding.Seeker TestEnemy = collider.GetComponent <Pathfinding.Seeker>(); if (LowestValue >= TestEnemy.RetreivePriority()) { LowestValue = TestEnemy.RetreivePriority(); HighestPriority = collider.gameObject; } } } target = HighestPriority; } }
// Start is called before the first frame update void Start() { // States init normal = new NormalState(); faster = new FasterState(); stronger = new StrongerState(); berzerk = new BerzerkState(); secondPeriod = new SecondPeriodState(); // Stats init speed = Stats.BossStat.Speed; life = Stats.BossStat.MaxHP; // AI init target = GameObject.Find("Player").transform; seeker = GetComponent <Pathfinding.Seeker>(); rb = GetComponent <Rigidbody2D>(); groundCheckRadius = 0.25f; collisionLayer = LayerMask.GetMask("Foundation"); enemyGFX = this.transform; InvokeRepeating("UpdatePath", 0f, 0.5f); // As the boss stats are updated widely during the fight we reset them at the begining //Stats.BossStat.ResetStat(); // The first two bosses appear in their normal state if (Stats.BossStat.Level < 2) { stateMachine.Initialize(normal); } // All the other bosses do more damage on start else { stateMachine.Initialize(stronger); } }
/** Use this for initialization. * * \param s Optionally provide in order to take tag penalties into account. May be null if you do not use a Seeker\ * \param p Path to follow * \param mergePartEndpoints If true, then adjacent parts that the path is split up in will * try to use the same start/end points. For example when using a link on a navmesh graph * Instead of first following the path to the center of the node where the link is and then * follow the link, the path will be adjusted to go to the exact point where the link starts * which usually makes more sense. * \param simplificationMode The path can optionally be simplified. This can be a bit expensive for long paths. */ public void Initialize(Seeker s, Path p, bool mergePartEndpoints, RichFunnel.FunnelSimplification simplificationMode) { if (p.error) { throw new System.ArgumentException("Path has an error"); } List <GraphNode> nodes = p.path; if (nodes.Count == 0) { throw new System.ArgumentException("Path traverses no nodes"); } seeker = s; // Release objects back to object pool // Yeah, I know, it's casting... but this won't be called much for (int i = 0; i < parts.Count; i++) { if (parts[i] is RichFunnel) { ObjectPool <RichFunnel> .Release(parts[i] as RichFunnel); } else if (parts[i] is RichSpecial) { ObjectPool <RichSpecial> .Release(parts[i] as RichSpecial); } } parts.Clear(); currentPart = 0; // Initialize new //Break path into parts for (int i = 0; i < nodes.Count; i++) { if (nodes[i] is TriangleMeshNode) { var graph = AstarData.GetGraph(nodes[i]); RichFunnel f = ObjectPool <RichFunnel> .Claim().Initialize(this, graph); f.funnelSimplificationMode = simplificationMode; int sIndex = i; uint currentGraphIndex = nodes[sIndex].GraphIndex; for (; i < nodes.Count; i++) { if (nodes[i].GraphIndex != currentGraphIndex && !(nodes[i] is NodeLink3Node)) { break; } } i--; if (sIndex == 0) { f.exactStart = p.vectorPath[0]; } else { f.exactStart = (Vector3)nodes[mergePartEndpoints ? sIndex - 1 : sIndex].position; } if (i == nodes.Count - 1) { f.exactEnd = p.vectorPath[p.vectorPath.Count - 1]; } else { f.exactEnd = (Vector3)nodes[mergePartEndpoints ? i + 1 : i].position; } f.BuildFunnelCorridor(nodes, sIndex, i); parts.Add(f); } else if (NodeLink2.GetNodeLink(nodes[i]) != null) { NodeLink2 nl = NodeLink2.GetNodeLink(nodes[i]); int sIndex = i; uint currentGraphIndex = nodes[sIndex].GraphIndex; for (i++; i < nodes.Count; i++) { if (nodes[i].GraphIndex != currentGraphIndex) { break; } } i--; if (i - sIndex > 1) { throw new System.Exception("NodeLink2 path length greater than two (2) nodes. " + (i - sIndex)); } else if (i - sIndex == 0) { //Just continue, it might be the case that a NodeLink was the closest node continue; } RichSpecial rps = ObjectPool <RichSpecial> .Claim().Initialize(nl, nodes[sIndex]); parts.Add(rps); } } }
// Token: 0x06002140 RID: 8512 RVA: 0x001890A0 File Offset: 0x001872A0 public void Initialize(Seeker seeker, Path path, bool mergePartEndpoints, bool simplificationMode) { if (path.error) { throw new ArgumentException("Path has an error"); } List <GraphNode> path2 = path.path; if (path2.Count == 0) { throw new ArgumentException("Path traverses no nodes"); } this.seeker = seeker; for (int i = 0; i < this.parts.Count; i++) { RichFunnel richFunnel = this.parts[i] as RichFunnel; RichSpecial richSpecial = this.parts[i] as RichSpecial; if (richFunnel != null) { ObjectPool <RichFunnel> .Release(ref richFunnel); } else if (richSpecial != null) { ObjectPool <RichSpecial> .Release(ref richSpecial); } } this.Clear(); this.Endpoint = path.vectorPath[path.vectorPath.Count - 1]; for (int j = 0; j < path2.Count; j++) { if (path2[j] is TriangleMeshNode) { NavmeshBase navmeshBase = AstarData.GetGraph(path2[j]) as NavmeshBase; if (navmeshBase == null) { throw new Exception("Found a TriangleMeshNode that was not in a NavmeshBase graph"); } RichFunnel richFunnel2 = ObjectPool <RichFunnel> .Claim().Initialize(this, navmeshBase); richFunnel2.funnelSimplification = simplificationMode; int num = j; uint graphIndex = path2[num].GraphIndex; while (j < path2.Count && (path2[j].GraphIndex == graphIndex || path2[j] is NodeLink3Node)) { j++; } j--; if (num == 0) { richFunnel2.exactStart = path.vectorPath[0]; } else { richFunnel2.exactStart = (Vector3)path2[mergePartEndpoints ? (num - 1) : num].position; } if (j == path2.Count - 1) { richFunnel2.exactEnd = path.vectorPath[path.vectorPath.Count - 1]; } else { richFunnel2.exactEnd = (Vector3)path2[mergePartEndpoints ? (j + 1) : j].position; } richFunnel2.BuildFunnelCorridor(path2, num, j); this.parts.Add(richFunnel2); } else if (NodeLink2.GetNodeLink(path2[j]) != null) { NodeLink2 nodeLink = NodeLink2.GetNodeLink(path2[j]); int num2 = j; uint graphIndex2 = path2[num2].GraphIndex; j++; while (j < path2.Count && path2[j].GraphIndex == graphIndex2) { j++; } j--; if (j - num2 > 1) { throw new Exception("NodeLink2 path length greater than two (2) nodes. " + (j - num2)); } if (j - num2 != 0) { RichSpecial item = ObjectPool <RichSpecial> .Claim().Initialize(nodeLink, path2[num2]); this.parts.Add(item); } } } }
// Token: 0x06000033 RID: 51 RVA: 0x0000417C File Offset: 0x0000257C public void Initialize(Seeker s, Path p, bool mergePartEndpoints, RichFunnel.FunnelSimplification simplificationMode) { if (p.error) { throw new ArgumentException("Path has an error"); } List <GraphNode> path = p.path; if (path.Count == 0) { throw new ArgumentException("Path traverses no nodes"); } this.seeker = s; for (int i = 0; i < this.parts.Count; i++) { if (this.parts[i] is RichFunnel) { ObjectPool <RichFunnel> .Release(this.parts[i] as RichFunnel); } else if (this.parts[i] is RichSpecial) { ObjectPool <RichSpecial> .Release(this.parts[i] as RichSpecial); } } this.parts.Clear(); this.currentPart = 0; for (int j = 0; j < path.Count; j++) { if (path[j] is TriangleMeshNode) { IFunnelGraph graph = AstarData.GetGraph(path[j]) as IFunnelGraph; RichFunnel richFunnel = ObjectPool <RichFunnel> .Claim().Initialize(this, graph); richFunnel.funnelSimplificationMode = simplificationMode; int num = j; uint graphIndex = path[num].GraphIndex; while (j < path.Count) { if (path[j].GraphIndex != graphIndex && !(path[j] is NodeLink3Node)) { break; } j++; } j--; if (num == 0) { richFunnel.exactStart = p.vectorPath[0]; } else if (mergePartEndpoints) { richFunnel.exactStart = (Vector3)path[num - 1].position; } else { richFunnel.exactStart = (Vector3)path[num].position; } if (j == path.Count - 1) { richFunnel.exactEnd = p.vectorPath[p.vectorPath.Count - 1]; } else if (mergePartEndpoints) { richFunnel.exactEnd = (Vector3)path[j + 1].position; } else { richFunnel.exactEnd = (Vector3)path[j].position; } richFunnel.BuildFunnelCorridor(path, num, j); this.parts.Add(richFunnel); } else if (path[j] != null && NodeLink2.GetNodeLink(path[j]) != null) { NodeLink2 nodeLink = NodeLink2.GetNodeLink(path[j]); int num2 = j; uint graphIndex2 = path[num2].GraphIndex; for (j++; j < path.Count; j++) { if (path[j].GraphIndex != graphIndex2) { break; } } j--; if (j - num2 > 1) { throw new Exception("NodeLink2 path length greater than two (2) nodes. " + (j - num2)); } if (j - num2 != 0) { RichSpecial item = ObjectPool <RichSpecial> .Claim().Initialize(nodeLink, path[num2]); this.parts.Add(item); } } } }
public PathfindingStalkerAi(PlayerView view, PathfindingStalkerAiModel model, Seeker seeker, Transform target) { _view = view != null ? view : throw new ArgumentNullException(nameof(view)); _model = model != null ? model : throw new ArgumentNullException(nameof(model)); _seeker = seeker != null ? seeker : throw new ArgumentNullException(nameof(seeker)); _target = target != null ? target : throw new ArgumentNullException(nameof(target)); }
/// <summary>Use this for initialization.</summary> /// <param name="seeker">Optionally provide in order to take tag penalties into account. May be null if you do not use a Seeker\</param> /// <param name="path">Path to follow</param> /// <param name="mergePartEndpoints">If true, then adjacent parts that the path is split up in will /// try to use the same start/end points. For example when using a link on a navmesh graph /// Instead of first following the path to the center of the node where the link is and then /// follow the link, the path will be adjusted to go to the exact point where the link starts /// which usually makes more sense.</param> /// <param name="simplificationMode">The path can optionally be simplified. This can be a bit expensive for long paths.</param> public void Initialize(Seeker seeker, Path path, bool mergePartEndpoints, bool simplificationMode) { if (path.error) { throw new System.ArgumentException("Path has an error"); } List <GraphNode> nodes = path.path; if (nodes.Count == 0) { throw new System.ArgumentException("Path traverses no nodes"); } this.seeker = seeker; // Release objects back to object pool // Yeah, I know, it's casting... but this won't be called much for (int i = 0; i < parts.Count; i++) { var funnelPart = parts[i] as RichFunnel; var specialPart = parts[i] as RichSpecial; if (funnelPart != null) { ObjectPool <RichFunnel> .Release(ref funnelPart); } else if (specialPart != null) { ObjectPool <RichSpecial> .Release(ref specialPart); } } Clear(); // Initialize new Endpoint = path.vectorPath[path.vectorPath.Count - 1]; //Break path into parts for (int i = 0; i < nodes.Count; i++) { if (nodes[i] is TriangleMeshNode) { var graph = AstarData.GetGraph(nodes[i]) as NavmeshBase; if (graph == null) { throw new System.Exception("Found a TriangleMeshNode that was not in a NavmeshBase graph"); } RichFunnel f = ObjectPool <RichFunnel> .Claim().Initialize(this, graph); f.funnelSimplification = simplificationMode; int sIndex = i; uint currentGraphIndex = nodes[sIndex].GraphIndex; for (; i < nodes.Count; i++) { if (nodes[i].GraphIndex != currentGraphIndex && !(nodes[i] is NodeLink3Node)) { break; } } i--; if (sIndex == 0) { f.exactStart = path.vectorPath[0]; } else { f.exactStart = (Vector3)nodes[mergePartEndpoints ? sIndex - 1 : sIndex].position; } if (i == nodes.Count - 1) { f.exactEnd = path.vectorPath[path.vectorPath.Count - 1]; } else { f.exactEnd = (Vector3)nodes[mergePartEndpoints ? i + 1 : i].position; } f.BuildFunnelCorridor(nodes, sIndex, i); parts.Add(f); } else if (NodeLink2.GetNodeLink(nodes[i]) != null) { NodeLink2 nl = NodeLink2.GetNodeLink(nodes[i]); int sIndex = i; uint currentGraphIndex = nodes[sIndex].GraphIndex; for (i++; i < nodes.Count; i++) { if (nodes[i].GraphIndex != currentGraphIndex) { break; } } i--; if (i - sIndex > 1) { throw new System.Exception("NodeLink2 path length greater than two (2) nodes. " + (i - sIndex)); } else if (i - sIndex == 0) { //Just continue, it might be the case that a NodeLink was the closest node continue; } RichSpecial rps = ObjectPool <RichSpecial> .Claim().Initialize(nl, nodes[sIndex]); parts.Add(rps); } else if (!(nodes[i] is PointNode)) { // Some other graph type which we do not have support for throw new System.InvalidOperationException("The RichAI movment script can only be used on recast/navmesh graphs. A node of type " + nodes[i].GetType().Name + " was in the path."); } } }
// Start is called before the first frame update private void Start() { seeker = GetComponent <Seeker>(); }
public void Initialize(Seeker s, Path p, bool mergePartEndpoints, RichFunnel.FunnelSimplification simplificationMode) { if (p.error) { throw new ArgumentException("Path has an error"); } List <GraphNode> path = p.path; if (path.Count == 0) { throw new ArgumentException("Path traverses no nodes"); } this.seeker = s; for (int i = 0; i < this.parts.Count; i++) { RichFunnel funnel = this.parts[i] as RichFunnel; RichSpecial special = this.parts[i] as RichSpecial; if (funnel != null) { Pathfinding.Util.ObjectPool <RichFunnel> .Release(ref funnel); } else if (special != null) { Pathfinding.Util.ObjectPool <RichSpecial> .Release(ref special); } } this.parts.Clear(); this.currentPart = 0; for (int j = 0; j < path.Count; j++) { if (path[j] is TriangleMeshNode) { NavGraph graph = AstarData.GetGraph(path[j]); RichFunnel item = Pathfinding.Util.ObjectPool <RichFunnel> .Claim().Initialize(this, graph); item.funnelSimplificationMode = simplificationMode; int start = j; uint graphIndex = path[start].GraphIndex; while (j < path.Count) { if ((path[j].GraphIndex != graphIndex) && !(path[j] is NodeLink3Node)) { break; } j++; } j--; if (start == 0) { item.exactStart = p.vectorPath[0]; } else { item.exactStart = (Vector3)path[!mergePartEndpoints ? start : (start - 1)].position; } if (j == (path.Count - 1)) { item.exactEnd = p.vectorPath[p.vectorPath.Count - 1]; } else { item.exactEnd = (Vector3)path[!mergePartEndpoints ? j : (j + 1)].position; } item.BuildFunnelCorridor(path, start, j); this.parts.Add(item); continue; } if (NodeLink2.GetNodeLink(path[j]) != null) { NodeLink2 nodeLink = NodeLink2.GetNodeLink(path[j]); int num5 = j; uint num6 = path[num5].GraphIndex; j++; while (j < path.Count) { if (path[j].GraphIndex != num6) { break; } j++; } j--; if ((j - num5) > 1) { throw new Exception("NodeLink2 path length greater than two (2) nodes. " + (j - num5)); } if ((j - num5) != 0) { RichSpecial special2 = Pathfinding.Util.ObjectPool <RichSpecial> .Claim().Initialize(nodeLink, path[num5]); this.parts.Add(special2); } } } }