- Home /
Issues cycling through Game objects in dictionary and activating currently selected objects script
so with this script its attached to my debug manager, and when you press left or right arrow keys its supposed to cycle through the game objects within the dictionary, first off it cycles through multiple obejts every press, and does not go in order, second im trying to access the "GuardStateMachine" script that is attached to the currently selected guard and change the "setCurState" int , in order to activate a certain state within that guard and only that guard but i cant get any of it to work properly
using System.Collections; using System.Collections.Generic; using UnityEngine;
public class debugmanager : MonoBehaviour {
[SerializeField] public GameObject[] Guards;
//Guard gsm;
int selectedIndex = 0;
//private GameObject theGuards;
private GuardStateMachine gsm;
int setState = 0;
// Use this for initialization
void Start () {
Guards[selectedIndex].GuardStateMachine.setCurState
= setState;
Guards = GameObject.FindGameObjectsWithTag("Guards");
gsm = gameObject.GetComponent<GuardStateMachine> ();
//gsm = GetComponent<Guard>();
}
// Update is called once per frame
void Update () {
if (Input.GetKey(KeyCode.RightArrow))
{
//if (selectedIndex >= 0 )
//Guards[selectedIndex].GetComponent<Selection>().SetHighlightEnabled(true);
Debug.Log ("Right Pressed");
//increment the index
selectedIndex ++;
// bounds check in case index goes higher than the objects in
// the array
if (selectedIndex >= Guards.Length)
selectedIndex = 0;
// output status
Debug.Log("DebugManager selected object #" + selectedIndex);
// Enable highlight on currently selected object in the array
Guards[selectedIndex].GetComponent<Selection>().SetHighlightEnabled(true);
}
else if (Input.GetKey(KeyCode.LeftArrow))
{
//if (selectedIndex >= 0 )
//Guards[selectedIndex].GetComponent<Selection>().SetHighlightEnabled(false);
//increment the index
selectedIndex -= 1;
// bounds check in case index goes higher than the objects in
// the array
if (selectedIndex < 0)
selectedIndex = Guards.Length;
// output status
Debug.Log("DebugManager selected object #" + selectedIndex);
// Enable highlight on currently selected object in the array
Guards[selectedIndex].GetComponent<Selection>().SetHighlightEnabled(true);
}
if (Input.GetKeyDown (KeyCode.Alpha1))
{
if (selectedIndex >= 0)
//Guards[selectedIndex].GetComponent<GuardStateMachine>().SetCurState(0);
Guards[selectedIndex].GetComponent<GuardStateMachine>().SetCurState(0);
}
if (Input.GetKeyDown (KeyCode.Alpha2))
{
if (selectedIndex >= 0 )
Guards[selectedIndex].GetComponent<GuardStateMachine>().SetCurState(1);
}
if (Input.GetKeyDown (KeyCode.Alpha3))
{
if (selectedIndex >= 0 )
Guards[selectedIndex].GetComponent<GuardStateMachine>().setCurState(2);
}
if (Input.GetKeyDown (KeyCode.Alpha4)) {
if (selectedIndex >= 0)
Guards [selectedIndex].GetComponent<Navigation> ().SetPingPong (false);
}
else if (Input.GetKeyDown (KeyCode.Alpha4)){
if (selectedIndex >= 0)
Guards [selectedIndex].GetComponent<Navigation> ().SetPingPong (true);
}
}
}
Answer by Dread_Boy · Nov 19, 2017 at 04:12 PM
Input.GetKey(KeyCode.RightArrow)
will return true
if right arrow is pressed during that frame and each frame correlates to one Update call. Since you keep button pressed for quite some time in terms of computer speed (let's say 5 frames), you will circle through many objects (5 objects if button press lasted 5 frames). What you should do instead is use Input.GetKeyDown
which will return true
only during the frame button was pressed down and it will keep returning false
until you release the key and press it again.
Your answer

Follow this Question
Related Questions
Cannot destroy Component while GameObject is being activated or deactivated 2 Answers
Script on multiple objects not working properly! 1 Answer
Adding script during runtime 2 Answers
How to detect if two objects become a square ? 1 Answer
Add a Transform/GameObject to the selection from an editor script 2 Answers