Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 12 Next capture
2021 2022 2023
1 capture
12 Jun 22 - 12 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 /
avatar image
0
Question by Frepperino · Oct 03, 2018 at 07:54 AM · c#movementenemy aitransform.translate

Trying to stop enemies from clumping together. What am I doing wrong?

Hi guys.

I think this is quite a common issue yet I haven't found any solution. I have a couple of enemies that just follow you but I don't want them to clump together, which they tend to do. Instead I'm trying to make them move as a flock.

In my code I simply cycle through every enemy instance to check the distance between them (I know this is far from optimal but I just want to make it work firstly). If they are too close they use transform.Translate() to push away from eachother. In my mind this would work but in reality it doesn't.

Could someone explain why so that I can correct my fault?

Here's my code (I believe the fault lies in the MoveToTarget function):

 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 
 public class EnemyMovement : MonoBehaviour {
 
     [SerializeField]
     private int hp = 40;
     [SerializeField]
     private float speed = 5f;
     [SerializeField]
     private float rotSpeed = 90f;
 
     public Transform target;
 
     private void FixedUpdate()
     {
         if (target == null)
         {
             GameObject search = GameObject.FindGameObjectWithTag("Player");
 
             if (search != null)
             {
                 target = search.transform;
             }
         }
 
         if (target == null)
         {
             return;
         }
 
 
         LookAtTarget();
         MoveToTarget();
     }
 
     private void LookAtTarget()
     {
         Vector3 direction = target.position - transform.position;
         direction.Normalize();
         float zAngle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
         Quaternion desiredRot = Quaternion.Euler(0, 0, zAngle);
         transform.rotation = Quaternion.RotateTowards(transform.rotation, desiredRot, rotSpeed * Time.deltaTime);
     }
 
     private void MoveToTarget()
     {
         transform.Translate(Vector3.right * Time.deltaTime * speed, Space.Self);
 
         GameObject[] objects = GameObject.FindGameObjectsWithTag("Enemy");
         foreach (var obj in objects)
         {
             if (Vector3.Distance(transform.position, obj.transform.position) < 2f && obj != gameObject)
             {
                 Debug.Log("Correcting position");
                 Vector3 dir = (transform.position - obj.transform.position).normalized;
                 transform.Translate(dir * speed * Time.deltaTime, Space.Self);
             }
         }
     }
 }
Comment
Add comment · Show 1
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 lgarczyn · Nov 29, 2019 at 05:05 AM 0
Share
      private void LookAtTarget()
      {
          Vector3 direction = target.position - transform.position;
          direction.Normalize();
          float zAngle = $$anonymous$$athf.Atan2(direction.y, direction.x) * $$anonymous$$athf.Rad2Deg;
          Quaternion desiredRot = Quaternion.Euler(0, 0, zAngle);
          transform.rotation = Quaternion.RotateTowards(transform.rotation, desiredRot, rotSpeed * Time.deltaTime);
      }

Could just be

      private void LookAtTarget()
      {
          var desiredRot = Quaternion.LookRotation(
               Vector3.up,
               target.position - transform.position);
          transform.rotation = Quaternion.RotateTowards(
               transform.rotation,
               desiredRot,
               rotSpeed * Time.deltaTime);
      }



Now the problem with your code might be that the need to move closer to the player is stronger than the local constraints you add to your flock. Only the enemies on the outside of the flock can actually move away.

If ins$$anonymous$$d you used an OverlapCircle to detect every enemy in some range, and that you moved away from their center of gravity, you would probably get a better result.

Better yet, if you used navmesh agents, you would get both pathfinding and collision avoidance.

2 Replies

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

Answer by Zodiarc · Oct 03, 2018 at 08:10 AM

Here's an article about Coordinated Movement. Seems to be about the exact problem you have.

Comment
Add comment · Show 3 · 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 Frepperino · Oct 06, 2018 at 03:35 PM 0
Share

Read that article and some other ones from that site. Really great one however they focused more on moving a unit like in a strategy game which was not what I was looking for (I was a bit unclear). I have ins$$anonymous$$d made use of my objects rigidbodies making them dynamic and adding a repel force between them when they get too close. Thanks for the answer through.

avatar image introvert2019unleash · Nov 29, 2019 at 04:57 AM 0
Share

Please your new script. I am having the same problem and have been trying

avatar image zombievirals introvert2019unleash · Dec 05, 2019 at 11:58 PM 0
Share

If you are using navmesh, I found a way that doesn't require scripting, I posted it as a reply on this forum. It basically involves adding 3 navmesh obstacles as children to the enemy object. I just used regular cubes, added the navmeshobstacle components to them, and then once I had them all in place around the enemy, I removed the mesh render and box collider components from them.

avatar image
0

Answer by zombievirals · Dec 05, 2019 at 11:56 PM

I found a way to do this fairly simply, if you are using navmesh. Just child three navmesh obstacles to your enemy. Like I have in this picture below, one on each side, and one on the back. You can adjust the size of the obstacles to how close you want the enemies to get near each other.

Bear in mind, this may not work out well for a really large number of enemies. Also, I haven't tested it extensively, but it has been working well so far.

alt text


anti-clumping.png (152.9 kB)
Comment
Add comment · 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

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

568 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 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 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

Making a bubble level (not a game but work tool) 1 Answer

Multiple Cars not working 1 Answer

Lag at first second of transform.Translate movement 2 Answers

Distribute terrain in zones 3 Answers

Enemy Movement Problem! 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