• 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 isoloph0bia · Oct 31, 2022 at 08:05 AM · scripting problemlistlistspuzzlelong

Button Command Input not working well (semi good base) [VERY LENGTHY]

So essentially I have two scripts CommandInputSystem and movement both attached to the same game object. Not$$anonymous$$ng wrong there but when I went to add combined buttons (like Side and Punch is Side Punch) on the same list index I get errors like below and the line of the error changes with what is being input. Also the "inputs" gets items removed (and not the inputTimes list) when there are directions on the list and the next item to be added is Punch or Kick and vice versa.

ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index System.Collections.Generic.List`1[T].RemoveAt (System.Int32 index) (at :0) CommandInputSystem.AddInput (System.String transInput, System.Single timeTime) (at Assets/Objects/GlobalPlayerAssets/CommandInputSystem.cs:57) movement.Update () (at Assets/Objects/GlobalPlayerAssets/movement.cs:166)

To be completely honest I've narrowed it down to the function being called outside the script or the function itself. If anyone has any solutions I'll take them. :)

Personally I t$$anonymous$$nk intricate puzzles like t$$anonymous$$s are really fun to solve with how time consuming they are and how many ways there are to solve them. Hopefully someone out there has that same enjoyment in t$$anonymous$$s puzzle here
(code below)

using System.Collections; using System.Collections.Generic; using UnityEngine;

 public class CommandInputSystem : MonoBehaviour
 {
     //accessibility variables
     public ScriptTestCharacter testChar;
 
     //active variables
     public string characterAssignment = "test";
     public List<string> inputs;
     public List<float> inputTimes;
 
     //shortcut variables
     public string n = "";
     public string s = "Side";
     public string bs = "BackSide";
     public string d = "Down";
     public string u = "Up";
     public string ubs = "UpBackSide";
     public string dbs = "DownBackSide";
     public string us = "UpSide";
     public string ds = "DownSide";
     public string p = "Punch";
     public string k = "Kick";
     public string t1 = "ComboOne";
     public string t2 = "ComboTwo";
     public string t3 = "ComboThree";
 
     private void Start()
     {
         inputs.Add(n);
         inputTimes.Add(Time.time);
         testChar = gameObject.GetComponent<ScriptTestCharacter>();
     }
 
     public void AddInput(string transInput, float timeTime)
     {
         inputs.Add(transInput);
         inputTimes.Add(Time.time);
         if ( inputTimes[inputTimes.Count - 2] - inputTimes[inputTimes.Count - 1] < 0.4f )
         {
         //punches
             //r
             if ( (inputs[inputs.Count - 2] == s && inputs[inputs.Count - 1] == p) || (inputs[inputs.Count - 2] == p && inputs[inputs.Count - 1] == s ))
             {
                 inputs.RemoveAt(inputs.Count - 2);
                 inputs.RemoveAt(inputs.Count - 1);
                 inputs.RemoveAt(inputTimes.Count - 2);
                 inputs.RemoveAt(inputTimes.Count - 1);
                 inputs.Add(s + " " + p);
             }
             //l
             if ( (inputs[inputs.Count - 2] == bs && inputs[inputs.Count - 1] == p) || (inputs[inputs.Count - 2] == p && inputs[inputs.Count - 1] == bs ))
             {
                 inputs.RemoveAt(inputs.Count - 2);
                 inputs.RemoveAt(inputs.Count - 1);
                 inputs.RemoveAt(inputTimes.Count - 2);
                 inputs.RemoveAt(inputTimes.Count - 1);
                 inputs.Add(bs + " " + p);
             }
             //tr
             if ( (inputs[inputs.Count - 2] == us && inputs[inputs.Count - 1] == p) || (inputs[inputs.Count - 2] == p && inputs[inputs.Count - 1] == us ))
             {
                 inputs.RemoveAt(inputs.Count - 2);
                 inputs.RemoveAt(inputs.Count - 1);
                 inputs.RemoveAt(inputTimes.Count - 2);
                 inputs.RemoveAt(inputTimes.Count - 1);
                 inputs.Add(us + " " + p);
             }
             //br
             if ( (inputs[inputs.Count - 2] == ds && inputs[inputs.Count - 1] == p) || (inputs[inputs.Count - 2] == p && inputs[inputs.Count - 1] == ds ))
             {
                 inputs.RemoveAt(inputs.Count - 2);
                 inputs.RemoveAt(inputs.Count - 1);
                 inputs.RemoveAt(inputTimes.Count - 2);
                 inputs.RemoveAt(inputTimes.Count - 1);
                 inputs.Add(ds + " " + p);
             }
             //tl
             if ( (inputs[inputs.Count - 2] == ubs && inputs[inputs.Count - 1] == p) || (inputs[inputs.Count - 2] == p && inputs[inputs.Count - 1] == ubs ))
             {
                 inputs.RemoveAt(inputs.Count - 2);
                 inputs.RemoveAt(inputs.Count - 1);
                 inputs.RemoveAt(inputTimes.Count - 2);
                 inputs.RemoveAt(inputTimes.Count - 1);
                 inputs.Add(ubs + " " + p);
             }
             //bl
             if ( (inputs[inputs.Count - 2] == dbs && inputs[inputs.Count - 1] == p) || (inputs[inputs.Count - 2] == p && inputs[inputs.Count - 1] == dbs ))
             {
                 inputs.RemoveAt(inputs.Count - 2);
                 inputs.RemoveAt(inputs.Count - 1);
                 inputs.RemoveAt(inputTimes.Count - 2);
                 inputs.RemoveAt(inputTimes.Count - 1);
                 inputs.Add(dbs + " " + p);
             }
             //t
             if ( (inputs[inputs.Count - 2] == u && inputs[inputs.Count - 1] == p) || (inputs[inputs.Count - 2] == p && inputs[inputs.Count - 1] == u ))
             {
                 inputs.RemoveAt(inputs.Count - 2);
                 inputs.RemoveAt(inputs.Count - 1);
                 inputs.RemoveAt(inputTimes.Count - 2);
                 inputs.RemoveAt(inputTimes.Count - 1);
                 inputs.Add(u + " " + p);
             }
             if ( (inputs[inputs.Count - 2] == d && inputs[inputs.Count - 1] == p) || (inputs[inputs.Count - 2] == p && inputs[inputs.Count - 1] == d ))
             {
                 inputs.RemoveAt(inputs.Count - 2);
                 inputs.RemoveAt(inputs.Count - 1);
                 inputs.RemoveAt(inputTimes.Count - 2);
                 inputs.RemoveAt(inputTimes.Count - 1);
                 inputs.Add(d + " " + p);
             }
         //kicks
             //r
             if ( (inputs[inputs.Count - 2] == s && inputs[inputs.Count - 1] == k) || (inputs[inputs.Count - 2] == k && inputs[inputs.Count - 1] == s ))
             {
                 inputs.RemoveAt(inputs.Count - 2);
                 inputs.RemoveAt(inputs.Count - 1);
                 inputs.RemoveAt(inputTimes.Count - 2);
                 inputs.RemoveAt(inputTimes.Count - 1);
                 inputs.Add(s + " " + k);
             }
             //l
             if ( (inputs[inputs.Count - 2] == bs && inputs[inputs.Count - 1] == k) || (inputs[inputs.Count - 2] == k && inputs[inputs.Count - 1] == bs ))
             {
                 inputs.RemoveAt(inputs.Count - 2);
                 inputs.RemoveAt(inputs.Count - 1);
                 inputs.RemoveAt(inputTimes.Count - 2);
                 inputs.RemoveAt(inputTimes.Count - 1);
                 inputs.Add(bs + " " + k);
             }
             //tr
             if ( (inputs[inputs.Count - 2] == us && inputs[inputs.Count - 1] == k) || (inputs[inputs.Count - 2] == k && inputs[inputs.Count - 1] == us ))
             {
                 inputs.RemoveAt(inputs.Count - 2);
                 inputs.RemoveAt(inputs.Count - 1);
                 inputs.RemoveAt(inputTimes.Count - 2);
                 inputs.RemoveAt(inputTimes.Count - 1);
                 inputs.Add(us + " " + k);
             }
             //br
             if ( (inputs[inputs.Count - 2] == ds && inputs[inputs.Count - 1] == k) || (inputs[inputs.Count - 2] == k && inputs[inputs.Count - 1] == ds ))
             {
                 inputs.RemoveAt(inputs.Count - 2);
                 inputs.RemoveAt(inputs.Count - 1);
                 inputs.RemoveAt(inputTimes.Count - 2);
                 inputs.RemoveAt(inputTimes.Count - 1);
                 inputs.Add(ds + " " + k);
             }
             //tl
             if ( (inputs[inputs.Count - 2] == ubs && inputs[inputs.Count - 1] == k) || (inputs[inputs.Count - 2] == k && inputs[inputs.Count - 1] == ubs ))
             {
                 inputs.RemoveAt(inputs.Count - 2);
                 inputs.RemoveAt(inputs.Count - 1);
                 inputs.RemoveAt(inputTimes.Count - 2);
                 inputs.RemoveAt(inputTimes.Count - 1);
                 inputs.Add(ubs + " " + k);
             }
             //bl
             if ( (inputs[inputs.Count - 2] == dbs && inputs[inputs.Count - 1] == k) || (inputs[inputs.Count - 2] == k && inputs[inputs.Count - 1] == dbs ))
             {
                 inputs.RemoveAt(inputs.Count - 2);
                 inputs.RemoveAt(inputs.Count - 1);
                 inputs.RemoveAt(inputTimes.Count - 2);
                 inputs.RemoveAt(inputTimes.Count - 1);
                 inputs.Add(dbs + " " + k);
             }
             //t
             if ( (inputs[inputs.Count - 2] == u && inputs[inputs.Count - 1] == k) || (inputs[inputs.Count - 2] == k && inputs[inputs.Count - 1] == u ))
             {
                 inputs.RemoveAt(inputs.Count - 2);
                 inputs.RemoveAt(inputs.Count - 1);
                 inputs.RemoveAt(inputTimes.Count - 2);
                 inputs.RemoveAt(inputTimes.Count - 1);
                 inputs.Add(u + " " + k);
             }
             if ( (inputs[inputs.Count - 2] == d && inputs[inputs.Count - 1] == k) || (inputs[inputs.Count - 2] == k && inputs[inputs.Count - 1] == d ))
             {
                 inputs.RemoveAt(inputs.Count - 2);
                 inputs.RemoveAt(inputs.Count - 1);
                 inputs.RemoveAt(inputTimes.Count - 2);
                 inputs.RemoveAt(inputTimes.Count - 1);
                 inputs.Add(d + " " + k);
             }
             inputTimes.Add(timeTime);
         }
         else if ( inputTimes[inputTimes.Count - 2] - inputTimes[inputTimes.Count - 1] > 1.4f )
         {
             InputsListClear();
             inputs.Add(transInput);
             inputTimes.Add(Time.time);
         }
         TestInputs();
     }
 
     void TestInputs()
     {
         string[] testShoryuken = new string[] { s, d, ds + " " + p };
         string[] testDoubleDash = new string[] { s, s };
         if ( characterAssignment == "test" )
         {
             for ( int i = 0; i <= testShoryuken.Length; i++ )
             {
                 if ( inputs[inputs.Count - (i+1)] != testShoryuken[i] )
                 {
                     Debug.Log("Nah lol");
                     break;
                 }
                 if ( i == testShoryuken.Length )
                 {
                     testChar.Shoryuken();
                     break;
                 }
             }
             for ( int i = 0; i <= testDoubleDash.Length; i++ )
             {
                 if ( inputs[(inputs.Count-1) - i] != testDoubleDash[i] )
                 {
                     Debug.Log("Nah lol");
                     break;
                 }
                 if ( i == testDoubleDash.Length )
                 {
                     testChar.DoubleDash();
                     break;
                 }
             }
             
         }
     }
 
     public void InputsListClear()
     {
         inputs.Clear();
         inputTimes.Clear();
         inputs.Add(n);
         inputTimes.Add(Time.time);
     }
 }


 using System; using System.Collections; using System.Collections.Generic; using UnityEngine;
 
 public class movement : MonoBehaviour
 {
     //Accessibility Variables
     public Rigidbody2D rb;
     CommandInputSystem cmdInput;
     List<string> cmdInputList;
     public GameObject opponent;
     private static bool f = false;
     private static bool t = true;
 
     [ Header ("Player Keys") ]
     public KeyCode rightInput;
     public KeyCode leftInput;
     public KeyCode upInput;
     public KeyCode downInput;
 
     public KeyCode comboPad1;
     public KeyCode comboPad2;
     public KeyCode comboPad3;
     public KeyCode Kick;
     public KeyCode Punch;
     public KeyCode Jump;
 
     [ Header ("Movement Variables") ]
     public float moveSpeed;
     public float jumpForce;
     public float deadZone;
     [SerializeField] private float moveX;
     [SerializeField] private float moveY;
 
     [ Header ("Checks") ]
     public bool isFacingRight = t;
     public bool isGrounded = t;
 
     void Start()
     {
         rb = gameObject.GetComponent<Rigidbody2D>();
         cmdInput = gameObject.GetComponent<CommandInputSystem>();
         cmdInputList = gameObject.GetComponent<CommandInputSystem>().inputs;
     }
 
     //Search:Update
     void Update()
     {
         //isFacingRight?
         if ( opponent.GetComponent<Transform>().position.x > gameObject.GetComponent<Transform>().position.x )
             isFacingRight = t;
         else
             isFacingRight = f;
 
 
 
         //left right math
         if ( Input.GetKey(rightInput) )
         {
             if ( Input.GetKey(leftInput) )
                 moveX = 0;
             else
                 moveX = 1;
         }
         else if ( Input.GetKey(leftInput) )
         {
             if ( Input.GetKey(rightInput) )
                 moveX = 0;
             else
                 moveX = -1;
         }
         else
             moveX = 0;
 
         //up down math
         if ( Input.GetKey(upInput) )
         {
             if ( Input.GetKey(downInput) )
                 moveY = 0;
             else
                 moveY = 1;
         }
         else if ( Input.GetKey(downInput) )
         {
             if ( Input.GetKey(upInput) )
                 moveY = 0;
             else
                 moveY = -1;
         }
         else
             moveY = 0;
 
 
 
 
         //Input List
         if ( isFacingRight )
         {
             if ( Input.GetKeyDown(rightInput) )
             {
                 if ( moveY == 0 )
                 {
                     cmdInput.AddInput("Side", Time.time);
                 }
                 if ( moveY == 1 )
                 {
                     cmdInput.AddInput("UpSide", Time.time);
                 }
                 if ( moveY == -1 )
                 {
                     cmdInput.AddInput("DownSide", Time.time);
                 }
             }
             if ( Input.GetKeyDown(leftInput) )
             {
                 if ( moveY == 0 )
                 {
                     cmdInput.AddInput("BackSide", Time.time);
                 }
                 if ( moveY == 1 )
                 {
                     cmdInput.AddInput("UpBackSide", Time.time);
                 }
                 if ( moveY == -1 )
                 {
                     cmdInput.AddInput("DownBackSide", Time.time);
                 }
             }
         }
         else
         {
             if ( Input.GetKeyDown(rightInput) )
             {
                 if ( moveY == 0 )
                 {
                     cmdInput.AddInput("BackSide", Time.time);
                 }
                 if ( moveY == 1 )
                 {
                     cmdInput.AddInput("UpBackSide", Time.time);
                 }
                 if ( moveY == -1 )
                 {
                     cmdInput.AddInput("DownBackSide", Time.time);
                 }
             }
             if ( Input.GetKeyDown(leftInput) )
             {
                 if ( moveY == 0 )
                 {
                     cmdInput.AddInput("Side", Time.time);
                 }
                 if ( moveY == 1 )
                 {
                     cmdInput.AddInput("UpSide", Time.time);
                 }
                 if ( moveY == -1 )
                 {
                     cmdInput.AddInput("DownSide", Time.time);
                 }
             }
         }
         if ( Input.GetKeyDown(upInput) )
             cmdInput.AddInput( cmdInput.u, Time.time);
         if ( Input.GetKeyDown(downInput) )
             cmdInput.AddInput( cmdInput.d, Time.time);
         if ( Input.GetKeyDown(Punch) )
             cmdInput.AddInput( "Punch", Time.time);
         if ( Input.GetKeyDown(Kick) )
             cmdInput.AddInput( "Kick", Time.time);
     }
 
     //Search:FixedUpdate
     void FixedUpdate()
     {
         if ( isGrounded )
         {
             //facing right movement
             if ( isFacingRight )
             {
                 if( moveX > deadZone )
                     rb.velocity = new Vector2( moveX * moveSpeed/1.6f, rb.velocity.y );
                 if( moveX < -(deadZone) )
                     rb.velocity = new Vector2( moveX * moveSpeed/3.2f, rb.velocity.y );
             }
 
             //facing left movement
             if ( !isFacingRight )
             {
                 if( moveX > deadZone )
                     rb.velocity = new Vector2( moveX * moveSpeed/3.2f, rb.velocity.y );
                 if( moveX < -(deadZone) )
                     rb.velocity = new Vector2( moveX * moveSpeed/1.6f, rb.velocity.y );
             }
 
             //Velocity Checks
             if( moveX < deadZone && moveX > -(deadZone) )
                 rb.velocity = new Vector2( 0f, rb.velocity.y );
             if( moveX > deadZone && moveX < -(deadZone) )
                 rb.velocity = new Vector2( 0f, rb.velocity.y );
 
             //Jump
             if ( Input.GetKey(Jump) )
             {
                 Invoke("InvokedJump", (2f/60f) );
                 isGrounded = false;
             }
         }
     }
 
     //Search:Trigger
     void OnTriggerEnter2D(Collider2D collider)
     {
         if(collider.gameObject.tag == "Floor")
         {
             rb.velocity = new Vector2( rb.velocity.x/1.3f , rb.velocity.y);
             Invoke("StopVelocitySlide", (5f/60f));
             Invoke("LandingWait", (10f/60f));
         }
     }
 
 
 
     //Search:Functions
     void LandingWait()
     {
         isGrounded = t;
     }
 
     void StopVelocitySlide()
     {
         rb.velocity = new Vector2( 0f, rb.velocity.y );
     }
 
     void InvokedJump()
     {
         rb.velocity = new Vector2(rb.velocity.x * 0.75f, jumpForce);
         isGrounded = f;
     }
 }
 


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 Captain_Pineapple · Oct 31, 2022 at 11:08 AM 0
Share

I'll just leave this here: What the hell is this and what does it do? Seriously. I've seen some nasty nasty code but this seems beyond saving to me.


Is there any reason that you need this overcomplicated structure of a code? Please at least refactor your code and make proper use of functions your code is far from being D.R.Y -> "D"ont "R"epeat "Y"ourself


Please at least change your AddInput function and move everything that is currently like this:

              if ( (inputs[inputs.Count - 2] == us && inputs[inputs.Count - 1] == k) || (inputs[inputs.Count - 2] == k && inputs[inputs.Count - 1] == us ))
              {
                  inputs.RemoveAt(inputs.Count - 2);
                  inputs.RemoveAt(inputs.Count - 1);
                  inputs.RemoveAt(inputTimes.Count - 2);
                  inputs.RemoveAt(inputTimes.Count - 1);
                  inputs.Add(us + " " + k);
              }

into a function:

       private void CheckInputTimes(string direction, string action)
       {
              if ( (inputs[inputs.Count - 2] == direction && inputs[inputs.Count - 1] == action) || (inputs[inputs.Count - 2] == action && inputs[inputs.Count - 1] == direction))
              {
                  inputs.RemoveAt(inputs.Count - 2);
                  inputs.RemoveAt(inputs.Count - 1);
                  inputs.RemoveAt(inputTimes.Count - 2);
                  inputs.RemoveAt(inputTimes.Count - 1);
                  inputs.Add(direction + " " + action);
              }
       }

so that it remains in code:

    CheckInputTimes(us, k);

This will shorten your code extremly, make it way way way more readable, and will extremly reduce the risk for some copypaste error in this.


Sorry for the rather harsh words but you really really should change this. You write about this being an "intricate puzzle" - it is only one because you made it one. From my experience it is also rather unlikely that you will get a solution to an almost 500 line code post in here with the amount of details you provided.

0 Replies

· Add your reply
  • Sort: 

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

259 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

Related Questions

Public list are not reflecting in inspector. 1 Answer

A node in a childnode? 1 Answer

Access list storing custom class variables from another script 1 Answer

NullReferenceException when adding String to list 1 Answer

How to make a simple gui list 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