• 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
Question by MadRobot · Feb 17, 2015 at 12:23 PM · c#cameradelegatessort

Sort Items Based on distance to Camera

Hi, I've been stuck on this problem for a week now and I can't figure out what I'm doing wrong. Can anybody help?

The situation

The player is able to move the camera around the game field. When the player presses 'fire', the tower closest (or second-closest) to the camera should fire.

The towers are held in a list. When the player presses 'fire', the list is sorted. A delegate is used for sorting. The delegate finds the distance from one tower to the camera and compares it to the distance of another tower to the camera. This should put the list of towers in order from nearest to farthest from the camera. At this point, either index 0 or 1 is selected.

What's happening / what I don't understand

Regardless if the player moves the camera, the list is sorted differently every time 'fire' is pressed. Strangely, the sort order alternates between 2 specific orders. The tower list starts out with tower ID's in this order: 0,1,2,3,4,5 and after firing, the order changes to 3, 4, 5, 0, 1, 2. Firing again returns to 0,1,2,3,4,5. Then back to 3,4,5,0,1,2. So it alternates between these two orders.

Following is my code. What do I have wrong, or what do I need to change, to make it do what I want it to do?

This is the sorting delegate:

 public static int TowerComparison (TowerWeapon a, TowerWeapon b) {
     Vector3    camPosition = Camera.main.transform.position;
     float distA = Vector3.SqrMagnitude(a.transform.position - camPosition);
     float distB = Vector3.SqrMagnitude(a.transform.position - camPosition);
 
     if (distA > distB) return 1;
     if (distA < distB) return -1;
     return 0;
 }

This is the 'fire' code:

 //    listen for player input to fire
 void Update () {
 
     //    no point in going further if the player hasn't tried to fire
     if (!Input.GetMouseButtonDown(0)) return;
 
     //    order the weapons from closest to furthest from the camera
     //    "weapons" type is List<TowerWeapons>
     weapons.Sort (GameUtilityMethods.TowerComparison);
 
     //    solution attempt #3 -- using for loop
     //    "numTowersAvailable" is a constant > 0 and < "weapons" length
     for (int i = 0 ; i < numTowersAvailable ; i++) {
         if (weapons[i].IsReady()) {
             weapons[i].Fire (target);
             break;
         }
     }
 }

Thanks for any insight you can offer!

Comment

People who like this

0 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 moghes · Feb 17, 2015 at 01:04 PM 0
Share

can you please provide the definition of Sort function as well.

Also explain GameUtilityMethods.TowerComparison.

what is TowerComparison ?

You have a function named TowerComparison which takes 2 TowerWeapon arguments and in your call above, it doesn't take any arguments.

I think better you post the whole thing or at least what related in order to get help.

1 Reply

· Add your reply
  • Sort: 
avatar image

Answer by rageingnonsense · Feb 17, 2015 at 10:33 PM

 float distA = Vector3.SqrMagnitude(a.transform.position - camPosition);
 float distB = Vector3.SqrMagnitude(a.transform.position - camPosition);

Did you really mean to use "a" twice? distA and distB will always be the same, and as such your function always returns 0.

Correct code would be:

 float distA = Vector3.SqrMagnitude(a.transform.position - camPosition);
 float distB = Vector3.SqrMagnitude(b.transform.position - camPosition);
Comment

People who like this

0 Show 0 · 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.

Welcome to Unity Answers

If you’re new to Unity Answers, please check our User Guide to help you navigate through our website and refer to our FAQ for more information.

Before posting, make sure to check out our Knowledge Base for commonly asked Unity questions.

Check our Moderator Guidelines if you’re a new moderator and want to work together in an effort to improve Unity Answers and support our users.

Follow this Question

Answers Answers and Comments

4 People are following this question.

avatar image avatar image avatar image avatar image

Related Questions

Distribute terrain in zones 3 Answers

Multiple Cars not working 1 Answer

How to put every modelpart in the correct layer in code? 0 Answers

Camera smooth movement from ponint A to B 0 Answers

Why is my camera switching angles? 0 Answers


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