• Unity
  • Services
  • Made with Unity
  • Learn
  • 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
  • Forums
  • Answers
  • Feedback
  • Issue Tracker
  • Blog
  • Evangelists
  • User Groups

Navigation

  • Home
  • Unity
  • Industries
  • Made with Unity
  • Learn
  • Community
    • Forums
    • Answers
    • Feedback
    • Issue Tracker
    • Blog
    • Evangelists
    • User Groups
  • Get Unity
  • Asset Store

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 H3yPlaya · Nov 26, 2018 at 10:10 PM · c#mouseclickenemy ai

Starcraft Styled Game

So I am trying to make a starcraft styled game, everything is going well so far, except for my Workers(Kinda like scv's). When I click on one of them, they all get selected. I don't know how to fix that, so only one of them gets selected. here's my code:

 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 using UnityEngine.AI;
 
 public class WorkerBehaviour : MonoBehaviour {
 
     public NavMeshAgent PlayerAgent;
     public LayerMask GroundLayer;
     public float TurningSpeed = 0.1f;
     public float Speed = 1.0f;
     public GameObject ParticleEffect;
 
     private bool Selected = false;
     private Camera Cam;
     private bool Move = false;
     private GameObject ParticleObject;
 
     void Awake() {
         Cam = Camera.main;
     }
 
     void Update () {
         Vector3 mouseWorldPosition = -Vector3.one;
 
         Ray ray = Cam.ScreenPointToRay(Input.mousePosition);
         RaycastHit hit;
 
         if (Physics.Raycast(ray, out hit)) {
             if (Input.GetMouseButtonDown(0)) {
                 if (hit.transform.tag == "Worker") {
                     if (!Selected) {
                         print(hit.transform.name + " Was Selected");
                         Move = false;
                         Selected = true;
                     }
                 } else {
                     Selected = false;
                 }
             }
 
             if (Input.GetMouseButtonDown(1)) {
                 if (Selected) {
                     if (hit.transform.tag == "Floor") {
                         Move = true;
                     }
                 } else {
                     Move = false;
                 }
 
                 if (Move) {
                     Destroy(ParticleObject);
                     PlayerAgent.SetDestination(GetPointUnderCursor());
                     PlayerAgent.speed = Speed;
                     PlayerAgent.angularSpeed = TurningSpeed;
                 }
             }
         }
     }
 
     Vector3 GetPointUnderCursor() {
         Vector3 mouseWorldPosition = -Vector3.one;
 
         Ray ray = Cam.ScreenPointToRay(Input.mousePosition);
         RaycastHit hit;
 
         if (Physics.Raycast(ray, out hit, 100f, GroundLayer)) {
             mouseWorldPosition = hit.point;
         }
 
         ParticleObject = Instantiate(ParticleEffect, new Vector3(mouseWorldPosition.x, mouseWorldPosition.y + 0.1f, mouseWorldPosition.z), Quaternion.Euler(90, 0, 0));
 
         Destroy(ParticleObject, 3);
 
         return mouseWorldPosition;
     }
 }
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
2
Best Answer

Answer by ShadyProductions · Nov 26, 2018 at 10:17 PM

Because it's a mouse event, it is triggered on all your workers. Which sets selected to true on all workers. You'll have to figure out a better way of doing this. Like checking which worker you're actually clicking on.

So instead of setting selected = true on the main class Get the workerbehaviour class from the hit and set the selected on that class to true.

              if (hit.transform.tag == "Worker") {
                  var workerClass = hit.GetComponent<WorkerBehaviour>();
                  if (workerClass != null && !workerClass.Selected) {
                      print(hit.transform.name + " Was Selected");
                      Move = false;
                      workerClass.Selected = true;
                  }
              }

You get the idea.. You'll have to make selected a public bool.

Comment
Add comment · Show 8 · 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 H3yPlaya · Nov 26, 2018 at 10:19 PM 0
Share

I see what you are saying, but not fully sure on how to do so.

avatar image H3yPlaya · Nov 26, 2018 at 10:28 PM 0
Share

WOW! AMAZING! It worked. Now, I tested it, and it worked, but how do I set Selected to False, when I click on a different worker, but not the one that is selected. So basically, there are 3 workers, and 1 is selected, if I click on the one that is selected, noting should happen, but if I select the either ones, the one I clicked should be Selected while the one that was selected is deselected.

avatar image H3yPlaya · Nov 26, 2018 at 10:36 PM 0
Share

@ShadyProductions Is that easy to do? or should I try doing it myself?

avatar image ecv80 H3yPlaya · Nov 26, 2018 at 11:04 PM 0
Share

Should be easy, try to figure it out. Either keep a reference to your current selection (better, I think), and deselect it before selecting a new one, or check all objects to check what's currently selected to deselect it before selecting your new one (worse, I think). Hint: You want to make it static to be able to access it from any of your WorkerBehaviours: public static WorkerBehaviour currentlySelected; This is assuming only one can be selected at a time.

avatar image ShadyProductions H3yPlaya · Nov 27, 2018 at 02:45 PM 0
Share

Maybe you should abstract this a bit more and split the mouse handling behaviour into a MouseManager script, and keep the WorkerBehaviour as a simple class that each worker has, this will complicate it a lot less. And as ecv80 has said, you should be able to keep a reference to the previous selected WorkerBehaviour.

avatar image H3yPlaya · Nov 27, 2018 at 12:31 AM 0
Share

@ecv80 hmm, I don't understand what you mean. could you show me some code?

avatar image ecv80 H3yPlaya · Nov 27, 2018 at 07:26 AM 0
Share

Something like this:

 public class WorkerBehaviour : MonoBehaviour {
 ...
 
 public static WorkerBehaviour currentSelection;
 
 
     void Update () {
     ...
         if (Physics.Raycast(ray, out hit)) {
             if (Input.GetMouseButtonDown(0)) {
                 if (hit.transform.tag == "Worker") {
                   var workerClass = hit.GetComponent<WorkerBehaviour>();
                   if (workerClass != null && !workerClass.Selected) {
                       //Deselect current selection
                         if (currentSelection!=null)
                             currentSelection.Selected=false;
                     //Select new
                       print(hit.transform.name + " Was Selected");
                       Move = false;
                       workerClass.Selected = true;
                       currentSelection=workerClass;
                   }
                 } else {
                 //Deselect current selection
                     if (currentSelection!=null) {
                         currentSelection.Selected=false;
                         currentSelection=null;
                     }
                 Selected = false;    //Not sure about this
                 }
              }
         ...
          }
     }
 
 }
 
 
avatar image H3yPlaya · Nov 27, 2018 at 09:26 PM 0
Share

Actually, I figured it out my self. I just need to do this: if (hit.transform.tag == "Worker") { var workerClass = hit.transform.GetComponent();

                     -->Selected = false;<--
                     if (workerClass != null && !workerClass.Selected) {
                         print(hit.transform.name + " Was Selected");
                         workerClass.Move = false;
                         workerClass.Selected = true;
                         Clicked();
                     }
                 }

I just needed to make everything deselect when I click, and after that what ever I clicked, will be selected.

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

The best place to ask and answer questions about development with Unity.

To help users navigate the site we have posted a site navigation guide.

If you are a new user to Unity Answers, check out our FAQ for more information.

Make sure to check out our Knowledge Base for commonly asked Unity questions.

If you are a moderator, see our Moderator Guidelines page.

We are making improvements to UA, see the list of changes.



Follow this Question

Answers Answers and Comments

575 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 avatar image avatar image avatar image avatar image avatar image avatar image avatar image

Related Questions

Multiple Cars not working 1 Answer

Distribute terrain in zones 3 Answers

why am i getting a vector2.scale error 2 Answers

Get transparency of one pixel 2 Answers

Converting C# Controller from WASD Controls to Click-Based 1 Answer

  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges