Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 13 Next capture
2021 2022 2023
1 capture
13 Jun 22 - 13 Jun 22
sparklines
Close Help
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
  • Help Room /
avatar image
0
Question by WagnerDav · Aug 24, 2020 at 10:59 AM · vector3transform.positiondistanceplayer movement

Move GameObject to Point A to B

I have the MapBrain.cs script:

 public class MapBrain : MonoBehaviour
     {        
         
         //Genetic Algorithm Parameters
         [SerializeField, Range(20,100)]
         private int populationSize = 20;
         [SerializeField, Range(0,100)]
         private int crossoverRate = 100;
         private double crossoverRatePercent;
         [SerializeField, Range(0,100)]
         private int mutationRate = 0;
         private double mutationRatePercent;
         [SerializeField, Range(1,100)]
         private int generationLimit = 10;
 
         //Algorithm Variables
         private List<CandidateMap> currentGeneration;
         private int totalFitnessThisGeneration, bestFitnessScoreAllTime = 0;
         private CandidateMap bestMap = null;
         private int bestMapGenerationNumber = 0, generationNumber = 1;
 
         //Fitness Parameters
         [SerializeField]
         private int fitnessCornerMin = 6, fitnessCornerMax = 12;
         [SerializeField, Range(1,3)]
         private int fitnessCornerWeight = 1, fitnessNearCornerWeight = 1;
         [SerializeField, Range(1,5)]
         private int fitnessPathWeight = 1;        
 
         //Map Start Parametes
         [SerializeField, Range(3,20)]
         private int widthOfMap = 11, lengthOfMap = 11;
         private Vector3 startPosition, exitPosition;
         private MapGrid grid;
         [SerializeField]
         private Direction startPositionEdge = Direction.Left, exitPositionEdge = Direction.Right;
         [SerializeField]
         private bool randomStartAndEnd = false;
         [SerializeField, Range(4,9)]
         private int numberOfKnightPieces = 7;
 
         //Visualize Grid
         public MapVisualizer mapVisualizer;
         DateTime startDate, endDate;        
         private bool isAlgorithmRunning = false;
 
         //Spawn Manager
         public Transform enemyPrefab;       
         
 
         public bool IsAlgorithmRunning { get => isAlgorithmRunning; }
 
         //Loading part 
         private void Start()
         {
             
             mutationRatePercent = mutationRate / 100D;
             crossoverRatePercent = crossoverRate / 100D;             
             
         }
 
         //Creates the scene
         public void RunAlgorithm()
         {
             
             UiController.instance.ResetScreen();
             UiController.instance.HideStartButton();
             UiController.instance.showLevelButton();                                  
             ResetAlgorithmVariables();
             mapVisualizer.ClearMap(); 
            
             grid = new MapGrid(widthOfMap, lengthOfMap);
 
             MapHelper.RandomlyChooseAndSetStartAndExit(grid, ref startPosition, ref exitPosition, randomStartAndEnd, startPositionEdge, exitPositionEdge);
             isAlgorithmRunning = true;
             startDate = DateTime.Now;
             FindOptimalSolution(grid);  
                               
             Debug.Log(EnemyDestination());
             InvokeRepeating("InstantiateEnemy", 5f, 5f);                    
            
         }
 
         //Reset the algorithm to place a new level
         public void ResetAlgorithmVariables()
         {
             totalFitnessThisGeneration = 0;
             bestFitnessScoreAllTime = 0;
             bestMap = null;
             bestMapGenerationNumber = 0;
             generationNumber = 0;
         }
         /*
         It will create several maps,
         according to the size of the population, 
         where it will go through the Genetic Algorithm and will return only the one with the best score
         */       
         public void FindOptimalSolution(MapGrid grid)
         {
             currentGeneration = new List<CandidateMap>(populationSize);
             for (int i = 0; i < populationSize; i++)
             {
                 var candidateMap = new CandidateMap(grid, numberOfKnightPieces);
                 candidateMap.CreateMap(startPosition, exitPosition, true);
                 currentGeneration.Add(candidateMap);
             }
 
             StartCoroutine(GeneticAlgorithm());
         }
         
         /*
             Genetic Algorithm:
             function GeneticAlgorithm(population, objective/function) exit: individual
             Enter: population→ list of individual = CandidateMap
             objective/function→ a function that receives an individual and returns a real number. = bestFitnessScoreThisGeneration
             repeat = foreach (var candidate in currentGeneration)
             list of parents := selection(population, objective/function) = CrossOverParents(parent1, parent2, out child1, out child2)
             population: = reproduction (list of parents) = List<CandidateMap> nextGeneration = new List<CandidateMap>()
         
         */
         private IEnumerator GeneticAlgorithm()
         {
             totalFitnessThisGeneration = 0;
             int bestFitnessScoreThisGeneration = 0;
             CandidateMap bestMapThisGeneration = null;
             foreach (var candidate in currentGeneration)
             {
                 //FindPath() = Finds a path between the generated obstacles
                 candidate.FindPath();
                 //Repair() = If there is a blocked path (Knight), repair
                 candidate.Repair();
                 var fitness = CalculateFitness(candidate.ReturnMapData());
 
                 totalFitnessThisGeneration+= fitness;
                 if(fitness> bestFitnessScoreThisGeneration)
                 {
                     bestFitnessScoreThisGeneration = fitness;
                     bestMapThisGeneration = candidate;
                 }
 
             }
             if(bestFitnessScoreThisGeneration > bestFitnessScoreAllTime)
             {
                 bestFitnessScoreAllTime = bestFitnessScoreThisGeneration;
                 bestMap = bestMapThisGeneration.DeepClone();
                 bestMapGenerationNumber = generationNumber;
             }
             generationNumber++;
             yield return new WaitForEndOfFrame();
            
             //Loading Values 
             UiController.instance.SetLoadingValue(generationNumber / (float)generationLimit);
             
             //Debug.Log("Current generation "+generationNumber+" score: "+bestMapThisGeneration);
 
             if(generationNumber < generationLimit)
             {
                 List<CandidateMap> nextGeneration = new List<CandidateMap>();
 
                 while(nextGeneration.Count < populationSize)
                 {
                     var parent1 = currentGeneration[RouletteWheelSelection()];
                     var parent2 = currentGeneration[RouletteWheelSelection()];
 
                     CandidateMap child1, child2;
 
                     CrossOverParents(parent1, parent2, out child1, out child2);
 
                     child1.AddMutation(mutationRatePercent);
                     child2.AddMutation(mutationRatePercent);
 
                     nextGeneration.Add(child1);
                     nextGeneration.Add(child2);
                 }
                 currentGeneration = nextGeneration;
 
                 StartCoroutine(GeneticAlgorithm());
             }
             else
             {
                 ShowResults();
             }
         }//End GeneticAlgorithm
 
         //Just shows interesting data and help mount the loading
         private void ShowResults()
         {
             isAlgorithmRunning = false;
             //Debug.Log("Best solution at generation "+bestMapGenerationNumber+" with score: "+bestFitnessScoreAllTime);
 
             var data = bestMap.ReturnMapData();
             mapVisualizer.VisaulizeMap(bestMap.Grid,data);
             
             UiController.instance.HideLoadingScreen();
 
             //Debug.Log("Path length: "+data.path);
             //Debug.Log("Corners count: "+data.cornersList.Count);
 
             endDate = DateTime.Now;
             long elapsedTicks = endDate.Ticks - startDate.Ticks;
             TimeSpan elapsedSpan = new TimeSpan(elapsedTicks);
             //Debug.Log("Time need to run this genetic optimisation: "+elapsedSpan.TotalSeconds);
         }
 
         //Mix The Genes
         private void CrossOverParents(CandidateMap parent1, CandidateMap parent2, out CandidateMap child1, out CandidateMap child2)
         {
             child1 = parent1.DeepClone();
             child2 = parent2.DeepClone();
 
             if(Random.value < crossoverRatePercent)
             {
                 int numBits = parent1.ObstaclesArray.Length;
                 
                 int crossOverIndex = Random.Range(0, numBits);
 
                 for (int i = crossOverIndex; i < numBits; i++)
                 {
                     child1.PlaceObstacle(i, parent2.IsObstacleAt(i));
                     child2.PlaceObstacle(i, parent1.IsObstacleAt(i));
                 }
             } 
         }
 
         //RouletteWheelSelection = Fitness proportionate selection
         private int RouletteWheelSelection()
         {
             int randomValue = Random.Range(0, totalFitnessThisGeneration);
             for (int i = 0; i < populationSize; i++)
             {
                 randomValue -= CalculateFitness(currentGeneration[i].ReturnMapData());
                 if(randomValue <= 0)
                 {
                     return i;
                 }
             }
             return populationSize - 1;
         }
 
         //Natural Selection 
         private int CalculateFitness(MapData mapData)
         {
             int numberOfObstacles = mapData.obstacleArray.Where(isObstacle => isObstacle).Count();
             int score = mapData.path.Count*fitnessPathWeight + (int)(numberOfObstacles*fitnessPathWeight);
             int cornersCount = mapData.cornersList.Count;
             if(cornersCount >= fitnessCornerMin && cornersCount <= fitnessCornerMax)
             {
                 score += cornersCount * fitnessCornerWeight;
             }
             else if(cornersCount>fitnessCornerMax)
             {
                 score -= fitnessCornerWeight * (cornersCount - fitnessCornerMax);
             }
             else if(cornersCount < fitnessCornerMin)
             {
                 score -= fitnessCornerWeight * fitnessCornerMin;
             }
             score -= mapData.cornersNearEachOther * fitnessNearCornerWeight;
             return score;
         }
         
         private void InstantiateEnemy()
         {                
             Instantiate(enemyPrefab, startPosition + new Vector3(.5f,.7f,.5f), Quaternion.identity);
         }
 
         public Vector3 EnemyDestination()
         {
            Vector3 destination =  exitPosition;   
            return destination;        
         }  
         
     }   


In it I have the EnemyDestination () method:

 public Vector3 EnemyDestination()
 {
    Vector3 destination =  exitPosition;   
    return destination;        
 }  

It returns to me the destination where the GameObject should go, but the exitPosition variable will only be set up as soon as I except the RunAlgorithm () method:

 public void RunAlgorithm()
 {
         
         UiController.instance.ResetScreen();
         UiController.instance.HideStartButton();
         UiController.instance.showLevelButton();                                  
         ResetAlgorithmVariables();
         mapVisualizer.ClearMap(); 
        
         grid = new MapGrid(widthOfMap, lengthOfMap);
 
         MapHelper.RandomlyChooseAndSetStartAndExit(grid, ref startPosition, ref exitPosition, randomStartAndEnd, startPositionEdge, exitPositionEdge);
         isAlgorithmRunning = true;
         startDate = DateTime.Now;
         FindOptimalSolution(grid);  
                           
         Debug.Log(EnemyDestination());
         InvokeRepeating("InstantiateEnemy", 5f, 5f);                    
        
  }

But now I have the Enemy.cs Script:

 public class Enemy : MonoBehaviour
 {
     private MapBrain brain;
     public float speed = 5f;       
     
     void Awake()
     {
          brain = GetComponent<MapBrain>(); 
     }
 
     void Update()
     {   
        
        while (Vector3.Distance(transform.position, brain.EnemyDestination()) > 0.02f)
        {
 
             transform.position = Vector3.Lerp(transform.position, brain.EnemyDestination(), speed * Time.deltaTime);
             
 
        }    
 
     }   
 
     void OnCollisionEnter(Collision other) 
     {
         if(other.gameObject.CompareTag("Tower"))
         {
             Destroy(gameObject);
         }    
     }  
 }

In it I'm trying to get the enemy to go to exitPosition, referencing the EnemyDestination () method, but I'm not getting it, does anyone know how I could do this?

Comment
Add comment
10 |3000 characters needed characters left characters exceeded
â–Ľ
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

1 Reply

· Add your reply
  • Sort: 
avatar image
0
Best Answer

Answer by IKDev · Aug 24, 2020 at 07:50 PM

Try using Vector2.MoveTowards() or Vector2.SmoothDamp()

Comment
Add comment · Show 1 · Share
10 |3000 characters needed characters left characters exceeded
â–Ľ
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image WagnerDav · Aug 24, 2020 at 09:04 PM 0
Share

I forgot to mark as solved. I did it this way:

First I put a Nav$$anonymous$$eshAgent in my $$anonymous$$apBrain script, then I made the following code for my InstantiateEnemy () method:

 private void InstantiateEnemy()
         {     
 
             enemyPrefab = (GameObject) Instantiate(enemyPrefab, startPosition + new Vector3(.5f,.7f,.5f), Quaternion.identity);
             nav$$anonymous$$eshAgent = enemyPrefab.GetComponent<Nav$$anonymous$$eshAgent>(); 
             if(enemyPrefab.transform.position != exitPosition)
             {                
                 nav$$anonymous$$eshAgent.SetDestination(exitPosition);               
             }
              
         }   

So he recognizes the path that has to go and where it has to go, and my Enemy.cs script just got a lot simpler:

 public class Enemy : $$anonymous$$onoBehaviour
     {
            
         private Rigidbody enemyRb;  
              
         
         void Start()
         {
             
             enemyRb = GetComponent<Rigidbody>();            
              
         }
           
         
         void OnCollisionEnter(Collision other) 
         {
             if(other.gameObject.CompareTag("Tower"))
             {
                 Destroy(gameObject);
             }    
         }  
     }


Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this Question

Answers Answers and Comments

241 People are following this question.

avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image

Related Questions

Using Raycast hit to set vector position then moving player to that position 2 Answers

Helicopter Move Local Position,Local Position 1 Answer

how to transform player movement in side right and left like a temple run or subway surfer 0 Answers

How to play animation depending on distance ?? (Video) 0 Answers

Move a object along a vector 1 Answer


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges