How to delete input binding in input system unity - c#

I have an issue to delete bindings in input system unity.
I know how to rebind and add binding with code but can't delete bindings with code.

You can remove an input binding from an input action using one of these methods:
action.ChangeBinding(...).Erase();
action.ChangeBindingWithId(...).Erase();
action.ChangeBindingWithPath(...).Erase();
action.ChangeBindingWithGroup(...).Erase();
Example
using UnityEngine;
using UnityEngine.InputSystem;
public class TestScript : MonoBehaviour
{
private InputAction action = new InputAction();
private void Start()
{
action.AddBinding("<Keyboard>/#(a)");
action.performed += OnActionPerformed;
action.Enable();
}
private void OnActionPerformed(InputAction.CallbackContext e)
{
Debug.Log($"Action performed: {e.control.name}");
action.ChangeBinding(0).Erase();
}
}

Related

I tried scriptable object as an input reader from input actions script but it won't work for some reason

i'm trying to invoke input events from a scriptable object as a channel or a layer between the input action script and the player like what unity does in its open project "chop chop" but it is not working at all with no errors or warnings . i don't know why ? can u help me please ? (using the new input system) this is the code for the channel :
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using UnityEngine.InputSystem;
[CreateAssetMenu(fileName ="testScriptableObject", menuName ="game/test SO")]
public class InputSOChannel : ScriptableObject
{
public event Action playerFire;
private TestControls testControl;
private void OnEnable() {
testControl = new TestControls();
testControl.test.fire.started += onfire;
}
private void onfire(InputAction.CallbackContext context)
{
playerFire?.Invoke();
Debug.Log("the event invoked!");
}
private void OnDisable() {
testControl.test.fire.started -= onfire;
}
}
and this for the player or input receiver :
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ObjectController : MonoBehaviour
{
[SerializeField] InputSOChannel inputSOChannel;
private void OnEnable() {
inputSOChannel.playerFire += isfiring;
}
private void OnDisable() {
inputSOChannel.playerFire -= isfiring;
}
private void isfiring()
{
Debug.Log("the event fired from the lowend!");
}
}
i really appreciate any help . thank you!
i just forgot to enable the input action script , beginner's mistake

Change function within unity inspector

I have a gameObject that needs to call lots of other functions. I was hoping to do something like this
Where I can select the gameobject and script for it to run. I can't figure out how to do this.
I'm calling a function on button click for a gui.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;
public class AvatarSystem : MonoBehaviour
{
public Button general;
public Button face;
public Button hair;
public Button eyebrows;
public Button clothing;
// Start is called before the first frame update
void Start()
{
var root = GetComponent<UIDocument>().rootVisualElement;
general = root.Q<Button>("general");
face = root.Q<Button>("face");
hair = root.Q<Button>("hair");
eyebrows = root.Q<Button>("eyebrows");
clothing = root.Q<Button>("clothing");
general.clicked += generalClicked;
face.clicked += faceClicked;
hair.clicked += hairClicked;
eyebrows.clicked += eyebrowsClicked;
clothing.clicked += clothingClicked;
}
void generalClicked()
{
}
void faceClicked()
{
}
void hairClicked()
{
}
void eyebrowsClicked()
{
}
void clothingClicked()
{
}
}
The 5 bottom functions should do something like the top image. Thanks
You can this script which creates buttons in the inspector.
This should be outside of your AvatarSystem class.
using Unity.Editor;
[CustomEditor(typeof(AvatarSystem))]
public class AvatarSystemGUI : Editor
{
public override void OnInspectorGUI()
{
AvatarSystem t = AvatarSystem(target);
if (GUILayout.Button("Test"))
{
t.ExampleMethod();
}
}
}
Let me know of any problems! :)
You want to use a Unity Event
You can use UnityEvent<T> to pass a dynamic type in your function.
Then you can use Unity IPointerClickHandler to capture a click on the object.
You can use AddListener of UnityEvent;
you can write the code like this;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;
public class AvatarSystem : MonoBehaviour
{
public Button general;
public Button face;
public Button hair;
public Button eyebrows;
public Button clothing;
// Start is called before the first frame update
void Start()
{
var root = GetComponent<UIDocument>().rootVisualElement;
general = root.Q<Button>("general");
face = root.Q<Button>("face");
hair = root.Q<Button>("hair");
eyebrows = root.Q<Button>("eyebrows");
clothing = root.Q<Button>("clothing");
general.onClick.AddListener(() => {
this.generalClicked();
this.faceClicked();
this.hairClicked();
this.eyebrowsClicked();
this.clothingClicked();
}) ;
}
void generalClicked()
{
}
void faceClicked()
{
}
void hairClicked()
{
}
void eyebrowsClicked()
{
}
void clothingClicked()
{
}
}

Not registering when the trigger is pressed

i have some code, that when the trigger of the right hand controller is pressed, it shoots a gun, however it doesn't appear to be working, i've tried to add a debug into the actual TriggerPressed section, and that doesn't show up in the log when i click it in game either, im just not sure where this problem is orginating from, and im stumped as to why it isn't working. It also compiles, so any guidance is appreciated
Edit: Not sure of its importance but decided to add this anyway, im using oculus rift controller's
Here's the (edit: UPDATED) code:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using EZEffects;
public class adamadam : MonoBehaviour
{
public SteamVR_TrackedController controllerRight;
private SteamVR_TrackedObject trackedObj;
private SteamVR_Controller.Device device;
private SteamVR_TrackedController controller;
public EffectTracer TracerEffect;
public Transform muzzleTransform;
// Use this for initialization
void Start()
{
// controller = controllerRight.GetComponent<SteamVR_TrackedController>();
controller.TriggerClicked += TriggerPressed;
// trackedObj = controllerRight.GetComponent<SteamVR_TrackedObject>();
}
private void TriggerPressed(object sender, ClickedEventArgs e)
{
Debug.Log("Clicked");
ShootWeapon();
}
public void ShootWeapon()
{
RaycastHit hit = new RaycastHit();
Ray ray = new Ray(muzzleTransform.position, muzzleTransform.forward);
device = SteamVR_Controller.Input((int)trackedObj.index);
device.TriggerHapticPulse(750);
TracerEffect.ShowTracerEffect(muzzleTransform.position,
muzzleTransform.forward, 250f);
if (Physics.Raycast(ray, out hit, 5000f))
{
if (hit.collider.attachedRigidbody)
{
Debug.Log("Hit" + hit.collider.gameObject.name);
}
}
}
}

How to code an UI button(with Exit funtion) for an Android device in Unity 3D(C#)?

I am a beginner of Unity 3D. I am writing an android app, and my start menu has an exit button. My idea is just very simple: after users press the exit button, the application will close.
I know Application.Quit() for quiting an app. But I just dont know how to detect a touch from user on a button and return the application.quit() method. Should I use sth like button.onclick or input.getTouch?
This is my code:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class ExitButton : MonoBehaviour {
public Button exitButton;
void Start()
{
Button btn = exitButton.GetComponent<Button>();
btn.onClick.AddListener(TaskOnClick);
}
void TaskOnClick()
{
Application.Quit ();
Debug.Log("You touched this button.");
}
}
After I tried to play my app, I get this error:
NullReferenceException: Object reference not set to an instance of an object
ExitButton.Start()
And it seems that I cant get signal from user touching the button.
Can someone give me a help?
I have linked my button in inspector, but i am not able to find my function name:TaskOnClick()
Inspector
Put the following code into a script
public void QuitGame()
{
Application.Quit();
}
attach the script to a game object then assign the button to a method using the OnClick window at the bottom of the button component in the inspector.
Attach the game object to the OnClick and choose the QuitGame function.
Note. This will only work in the build of the game and not in the editor.
You are mixing up between two methods of using a button.
If you are following #Jack Foulkes's method then you don't need to assign the button externally. That means you don't need the following code:
public Button exitButton;
void Start()
{
Button btn = exitButton.GetComponent<Button>();
btn.onClick.AddListener(TaskOnClick);
}
If you use the above code, then you don't need to add OnClick event listener in inspector, as you are already adding it inside your code. Only your code will work. You are getting the null reference, because you haven't assigned the exitButton from inspector actually.
It should look like this in the inspector:
inspector
simple you have problem with access modifiers to fix this just type
public void TaskOnClick()
{
Application.Quit ();
}
check this video it's will help you create a professional gui.
How to make a professional GUI using unity
Create a script with the following contents and then attach it to the corresponding button click
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ExitButton : MonoBehaviour {
public void ExitGame()
{
print("Exiting...");
Application.Quit();
}
}
Hello,
All you need to do is to just make this function Public
like this:
public void TaskOnClick()
{
Application.Quit();
}
You Can Also make an if statement to make it much better :)
FOR EXAMPLE:
public void TaskOnClick()
{
if (Input.GetKeyDown(KeyCode.Escape) // You Can also change the key
{
Application.Quit();
}
}
And If you want to make it less effort MAKE a Function
TRY THIS:
public void ExitFunction()
{
if (Input.GetKeyDown(KeyCode.Escape) // Or Any Other Key
{
Application.Quit();
Debug.Log("exitgame");
}
}
Public void TaskOnClick()
{
ExitFunction();
}
And Also Here is the code if you want to make the same function but on the left Mouse Button Click
public void ExitFunction()
{
if (Input.GetMouseButtonDown(0))
{
Application.Quit();
Debug.Log("exitgame");
}
}
public void TaskOnClick()
{
ExitFunction();
}
If you want it with the Right Mouse Button
Here is the Answer:
public void ExitFunction()
{
if (Input.GetMouseButtonDown(1))
{
Application.Quit();
Debug.Log("quitgame");
}
}
public void TaskOnClick()
{
ExitFunction();
}
If you want it but with the middle buttonHere is the Answer:
public void ExitFunction()
{
if (Input.GetMouseButtonDown(2))
{
Application.Quit();
Debug.Log("quitgame");
}
}
public void TaskOnClick()
{
ExitFunction();
}
Full Best Code:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class ExitButton : MonoBehaviour
{
public void ExitFunction()
{
if (Input.GetMouseButtonDown(0))
{
Application.Quit();
Debug.Log("quitgame");
}
}
public void TaskOnClick()
{
ExitFunction();
}
}
Lesson Summary:
-- Sometimes Use public when we need it like when we use GameObjects and Transforms for example.
-- if () statement is used to make the I.D.E understands the very specific objects like Do an action when .... is pressed.
Thank you.
Hope This Helped
Eyad ,
A Professional Game Developer & Front End Web Developer
Do you link your button in inspector?
EDIT.
I think this should be changed also:
void TaskOnClick()
{
Debug.Log("You touched this button.");
Application.Quit ();
}

Unity Change Scene with button

I've been having problems with my code for unity. I'm using C Sharp and Unity 5.0.2f Personal Edition. Here's my code:
using UnityEngine;
using System.Collections;
public class ButtonEvent : MonoBehaviour {
public void LoadScene(int SceneToChangeTo){
Application.LoadLevel (SceneToChangeTo);
}
}
This should change the to an integer scene but when I go to the button.onclick() in the inspector and add the script nothing comes up about changing scene (Note: The script is under "_Manager" (An empty GameObject))
Add a listener for your button and make sure you put a value in numberOfLevel variable and assign your button to MyButton in the inspector or you will get a null reference exception
[SerializeField] private Button MyButton = null; // assign in the editor
public int numberoflevel;
void Start() { MyButton.onClick.AddListener(() => { changeScene(numberoflevel);});
}
public void LoadScene(int SceneToChangeTo){
Application.LoadLevel (SceneToChangeTo);
}
use this code:
using UnityEngine.SceneManagement;
///***///
public void LoadGameLevel(int SceneToChangeTo)
{ SceneManager.LoadScene(SceneToChangeTo);
}
//or
public void LoadGameLevel(string SceneName)
{ SceneManager.LoadScene(SceneName);
}
note: Worked in OnMouseDown() and Unity Ui and other

Categories

Resources