DFPosition GetNextNavPosition(MobileDirection direction) { DFPosition nextPosition = new DFPosition(0, 0); switch (direction) { case MobileDirection.North: nextPosition = new DFPosition(currentNavPosition.X, currentNavPosition.Y - 1); break; case MobileDirection.South: nextPosition = new DFPosition(currentNavPosition.X, currentNavPosition.Y + 1); break; case MobileDirection.East: nextPosition = new DFPosition(currentNavPosition.X + 1, currentNavPosition.Y); break; case MobileDirection.West: nextPosition = new DFPosition(currentNavPosition.X - 1, currentNavPosition.Y); break; } return(nextPosition); }
void SetFacing(MobileDirection facing) { // Select a random facing direction if (facing == MobileDirection.Random) { facing = (MobileDirection)Random.Range((int)MobileDirection.North, (int)MobileDirection.West + 1); } // Set mobile transform facing in this direction switch (facing) { case MobileDirection.North: transform.rotation = Quaternion.Euler(0, 0, 0); break; case MobileDirection.South: transform.rotation = Quaternion.Euler(0, 180, 0); break; case MobileDirection.East: transform.rotation = Quaternion.Euler(0, 90, 0); break; case MobileDirection.West: transform.rotation = Quaternion.Euler(0, -90, 0); break; } // Store new facing currentDirection = facing; }
public static LayerComparer FromDirection(MobileDirection dir) { dir &= MobileDirection.Up; if (dir == MobileDirection.Down) { return Forward; } return Backward; }
public static LayerComparer FromDirection(MobileDirection dir) { dir &= MobileDirection.Up; if (dir == MobileDirection.Down) { return(Forward); } return(Backward); }
// Check for geometry in the way (stairs,...) bool IsDirectionClear(MobileDirection direction) { Vector3 tempTargetScenePosition = cityNavigation.WorldToScenePosition(cityNavigation.NavGridToWorldPosition(GetNextNavPosition(direction))); // Aim low to better detect stairs tempTargetScenePosition.y += 0.1f; Ray ray = new Ray(transform.position, tempTargetScenePosition - transform.position); bool collision = Physics.Raycast(transform.position, tempTargetScenePosition - transform.position, Vector3.Distance(transform.position, tempTargetScenePosition), ~mobileAsset.GetLayerMask()); // Debug.DrawRay(transform.position, tempTargetScenePosition - transform.position, collision ? Color.red : Color.green, 1f); return(!collision); }
int GetNextNavPositionWeight(MobileDirection direction) { // Must have a current position on navgrid if (!cityNavigation || currentNavPosition.X == -1 || currentNavPosition.Y == -1) { return(0); } // Get next nav position and regard occupied tiles as weight 0 DFPosition nextPosition = GetNextNavPosition(direction); if (cityNavigation.HasFlags(nextPosition, CityNavigation.TileFlags.Occupied)) { return(0); } return(cityNavigation.GetNavGridWeightLocal(nextPosition)); }
void SeekingTile() { // Population manager will recycle this mobile if it can't find a target after several attempts seekCount++; // Ensure mobile is on grid InitNavPosition(currentNavPosition); // Get surrounding weights localWeights[(int)MobileDirection.North] = GetNextNavPositionWeight(MobileDirection.North); localWeights[(int)MobileDirection.South] = GetNextNavPositionWeight(MobileDirection.South); localWeights[(int)MobileDirection.East] = GetNextNavPositionWeight(MobileDirection.East); localWeights[(int)MobileDirection.West] = GetNextNavPositionWeight(MobileDirection.West); // Get current and target weights int currentWeight = GetCurrentNavPositionWeight(); int targetWeight = localWeights[(int)currentDirection]; // A small chance to randomly change direction - this keeps the movement shuffled if (Random.Range(0f, 1f) < randomChangeChance) { targetWeight = 0; } // Always change direction if target weight is zero - weight of target doesn't matter if (targetWeight == 0) { // Try to move in any valid random direction int randomDirection = Random.Range(0, localWeights.Length); if (localWeights[randomDirection] == 0) { return; } SetFacing((MobileDirection)randomDirection); SetTargetPosition(); return; } // High chance to change direction if target weight lower than current weight // This will cause mobiles to generally follow roads and other nice surfaces if (targetWeight < currentWeight && Random.Range(0f, 1f) > tileDowngradeChance) { // Evaluate in random order so if multiple equal "bests" are found we go a random direction int bestWeight = targetWeight; MobileDirection bestDirection = currentDirection; System.Random rand = new System.Random(); foreach (int i in Enumerable.Range(0, 3).OrderBy(x => rand.Next(3))) { if (localWeights[i] > bestWeight) { bestWeight = localWeights[i]; bestDirection = (MobileDirection)i; } } // Start heading in new best direction SetFacing(bestDirection); currentDirection = bestDirection; SetTargetPosition(); return; } // Otherwise keep marching in current direction SetTargetPosition(); }
public static LayerComparer FromDirection(MobileDirection dir) { return(LayerComparer.maleComparers[(int)(dir & MobileDirection.Up)]); }