Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 12 Next capture
2021 2022 2023
1 capture
12 Jun 22 - 12 Jun 22
sparklines
Close Help
  • 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 Dark-Link · May 29, 2020 at 08:39 AM · movementswipecontrollersdown

Move down while on air (swipe down with key and touch while on air, jumping. Cancel jump and instant go down)

Hello I am making an endless runner and i would like to have the possibility of canceling the jump while on air and instant go down ( like subway surfers ) I am making confusion where i should add Maybe some one could help? This is the Player.cs:

 using UnityEngine;
 using System.Collections;
 using UnityStandardAssets.CrossPlatformInput;
 using UnityEngine.UI;
 
 public class Player : MonoBehaviour {
 
     public float speedModifier = 0.05f;
     public float cameraSpeed = 0.05f;
 
     public Vector3 cameraRotation;
     public Vector3 cameraPosition;
 
     public float timeScoreMultiplier = 10f;
     public float crouchDuration = 1f;
 
     public float pursuerPositionOffset = 4f;
 
     public float initialHitSpeed = -10f;
     public float hitSpeedDecreaseSpeed = 80f;
 
     public LayerMask levelLayer;
     public AudioClip jumpSideClip;
     public AudioClip jumpClip;
     public AudioClip gameOverClip;
     public AudioClip crouchClip;
 
     public BoxCollider[] boxCollider;
     public CapsuleCollider[] capsuleColliders;
 
     public float mouseAndTouchMoveDistance = 80f;
 
     public bool enableKeyboardMovement = true;
     public bool enableMouseMovement = true;
 
     [SerializeField]
     protected float m_GroundCheckDistance = 0.1f;
     protected float m_OrigGroundCheckDistance;
     protected Vector3 m_GroundNormal;
     [SerializeField]
     protected float m_JumpPower = 12f;
     [SerializeField]
     protected float stepDistance = 1.5f;
 
     public float speed = 3f;
 
     public int skinPrice = 1000;
 
     protected Animator anim;
 
     protected float posX = 0.0f;
     protected float startTime;
     protected float jumpSpeed;
     protected bool m_Jump;
     protected Rigidbody m_Rigidbody;
 
     protected bool m_PreviouslyGrounded, m_IsGrounded;
     protected Collider m_Collider;
     protected Vector3 m_GroundContactNormal;
 
     protected bool dead;
 
     protected int coins;
     protected float time;
     protected bool crouching;
     protected float crouchDeltaHeight = 1f;
     protected Manager manager;
 
     protected float jumpMultiplier = 1f;
     protected float timeMultiplier = 1f;
     protected float coinsMultiplier = 1f;
 
     protected float jumpMultiplierTime;
     protected float timeMultiplierTime;
     protected float coinsMultiplierTime;
 
     protected AudioSource audioSource;
    
     protected Vector2 fp;  // first finger position
     protected Vector2 lp;  // last finger position
     protected bool swiped = true;
 
     protected float animForward = 0.5f;
    
     protected float hitSpeedLoc;
     [HideInInspector]
     public Transform thisTransform;
 
     protected virtual void Awake()
     {
         thisTransform = transform;
     }
 
     protected virtual void Start ()
     {       
         hitSpeedLoc = speed;
         anim = GetComponentInChildren<Animator>();
         anim.applyRootMotion = false;
 
         m_Collider = GetComponent<CapsuleCollider>();
         m_Rigidbody = GetComponent<Rigidbody>();
 
         m_OrigGroundCheckDistance = m_GroundCheckDistance;
         manager = GameObject.Find("Manager").GetComponent<Manager>();
 
         audioSource = GetComponent<AudioSource>();
     }
 
     protected virtual void Crouch()
     {
         audioSource.PlayOneShot(crouchClip);
         anim.SetBool("Crouch", true);
         crouching = true;
 
         for (int i = 0; i < boxCollider.Length; i++)
         {
             boxCollider[i].size -= new Vector3(0, crouchDeltaHeight, 0);
             boxCollider[i].center -= new Vector3(0, crouchDeltaHeight / 2, 0);
         }
         for (int i = 0; i < capsuleColliders.Length; i++)
         {
             capsuleColliders[i].height -= crouchDeltaHeight;
             capsuleColliders[i].center -= new Vector3(0, crouchDeltaHeight / 2, 0);
         }
 
         Invoke("stopCrouching", crouchDuration);
     }
 
     protected virtual void stopCrouching()
     {
         anim.SetBool("Crouch", false);
         crouching = false;
 
         for (int i = 0; i < boxCollider.Length; i++)
         {
             boxCollider[i].size += new Vector3(0, crouchDeltaHeight, 0);
             boxCollider[i].center += new Vector3(0, crouchDeltaHeight / 2, 0);
         }
         for (int i = 0; i < capsuleColliders.Length; i++)
         {
             capsuleColliders[i].height += crouchDeltaHeight;
             capsuleColliders[i].center += new Vector3(0, crouchDeltaHeight / 2, 0);
         }
     }
 
     protected virtual void Jump()
     {
         RaycastHit hitInfo;
         if (!Physics.Raycast(thisTransform.position + Vector3.up, Vector3.up, out hitInfo, 2f, levelLayer))
         {
             m_Jump = true;
             if (crouching)
             {
                 CancelInvoke("stopCrouching");
                 stopCrouching();
             }
         }
     }
 
     protected virtual void MoveSide(bool right)
     {
         if (m_IsGrounded)
         {
             anim.SetBool("Side", right);
             anim.SetTrigger("JumpSide");
 
             audioSource.PlayOneShot(jumpSideClip);
         }
         if (crouching)
         {
             CancelInvoke("stopCrouching");
             stopCrouching();
         }
         
         RaycastHit hitInfo;
 
         if (!right)
         {
             if (!Physics.Raycast((thisTransform.position + Vector3.up * 0.1f) + (Vector3.forward / 8f), Vector3.left, out hitInfo, 2f, levelLayer)
              && !Physics.Raycast((thisTransform.position + Vector3.up * 0.1f) - (Vector3.forward / 8f), Vector3.left, out hitInfo, 2f, levelLayer))
                 posX = posX - stepDistance;
         }
         else
         {
             if (!Physics.Raycast((thisTransform.position + Vector3.up * 0.1f) + (Vector3.forward / 8f), Vector3.right, out hitInfo, 2f, levelLayer)
              && !Physics.Raycast((thisTransform.position + Vector3.up * 0.1f) - (Vector3.forward / 8f), Vector3.right, out hitInfo, 2f, levelLayer))
                 posX = posX + stepDistance;
         }
     }
 
     protected bool HasMouseMoved()
     {
         return (Input.GetAxis("Mouse X") != 0) || (Input.GetAxis("Mouse Y") != 0);
     }
 
     protected virtual void Update()
     {
         if (!dead && manager.play && !manager.cameraLerp && Time.timeScale != 0)
         {
             if (Time.timeScale != 0)
             {
                 time += Time.deltaTime * timeMultiplier;
                 manager.timeScore.text = (time * timeScoreMultiplier).ToString("F0");
             }
            
             CheckGroundStatus();
 
             if (animForward < 1f)
             {               
                 anim.SetFloat("Forward", animForward);
                 animForward += Time.deltaTime * 2f;
             }
             else
                 anim.SetFloat("Forward", 1f);
 
             if (!crouching)
                 anim.SetBool("OnGround", m_IsGrounded);
 
             if (!m_IsGrounded)            
                 anim.SetFloat("Jump", m_Rigidbody.velocity.y);            
 
 #if UNITY_ANDROID || UNITY_IOS
 
             //Mobile Platforms movement
             foreach (Touch touch in Input.touches)
             {
                 if (touch.phase == TouchPhase.Began)
                 {
                     swiped = false;
                     fp = touch.position;
                     lp = touch.position;
                 }
                 if (touch.phase == TouchPhase.Moved)
                 {
                     lp = touch.position;
                 }
                 if (touch.phase == TouchPhase.Ended)
                 {
                     swiped = true;
                 }
                 if(!swiped)
                 {
                     if ((fp.x - lp.x) > mouseAndTouchMoveDistance) // left swipe
                     {
                         swiped = true;
                         MoveSide(false);
                     }
                     else if ((fp.x - lp.x) < -mouseAndTouchMoveDistance) // right swipe
                     {
                         swiped = true;
                         MoveSide(true);
                     }
                     else if ((fp.y - lp.y) < -mouseAndTouchMoveDistance) // up swipe
                     {
                         if (!m_Jump)
                         {
                             swiped = true;
                             Jump();
                         }
                     }
                     else if ((fp.y - lp.y) > mouseAndTouchMoveDistance) // down swipe
                     {
                         if (m_IsGrounded && !crouching)
                         {
                             swiped = true;
                             Crouch();
                         }
                     }
                 }
             }
 #else            
             //Mouse movement
             if (enableMouseMovement)
             {
                 if (Input.GetKeyDown(KeyCode.Mouse0))
                 {
                     swiped = false;
                     fp = Input.mousePosition;
                     lp = Input.mousePosition;
                 }
                 if (HasMouseMoved())
                 {
                     lp = Input.mousePosition;
                 }
                 if (Input.GetKeyUp(KeyCode.Mouse0))
                 {
                     swiped = true;
                 }
                 if (!swiped)
                 {
                     if ((fp.x - lp.x) > mouseAndTouchMoveDistance) // left swipe
                     {
                         swiped = true;
                         MoveSide(false);
                     }
                     else if ((fp.x - lp.x) < -mouseAndTouchMoveDistance) // right swipe
                     {
                         swiped = true;
                         MoveSide(true);
                     }
                     else if ((fp.y - lp.y) < -mouseAndTouchMoveDistance) // up swipe
                     {
                         if (!m_Jump)
                         {
                             swiped = true;
                             Jump();
                         }
                     }
                     else if ((fp.y - lp.y) > mouseAndTouchMoveDistance) // down swipe
                     {
                         if (m_IsGrounded && !crouching)
                         {
                             swiped = true;
                             Crouch();
                         }
                     }
                 }
             }
 
             //Keyboard movement
             if (enableKeyboardMovement)
             {
                 float horizontal = CrossPlatformInputManager.GetAxis("Horizontal");
                 float vertical = CrossPlatformInputManager.GetAxis("Vertical");
 
                 Vector3 m_Input = new Vector2(horizontal, vertical);
 
                 if (CrossPlatformInputManager.GetButtonDown("Horizontal") && m_Input.x < 0)
                 {
                     MoveSide(false);
                 }
                 if (CrossPlatformInputManager.GetButtonDown("Horizontal") && m_Input.x > 0)
                 {
                     MoveSide(true);
                 }
                 if (CrossPlatformInputManager.GetButtonDown("Vertical") && m_Input.y > 0)
                 {
                     if (!m_Jump)
                     {
                         Jump();
                     }
                 }
                 if (CrossPlatformInputManager.GetButtonDown("Vertical") && m_Input.y < 0)
                 {
                     if (m_IsGrounded && !crouching)
                     {
                         Crouch();
                     }
                 }
             }
 #endif
 
             if (m_IsGrounded)
             {
                 HandleGroundedMovement(m_Jump);
             }                     
             
             speed += Time.deltaTime * speedModifier;
                         
             if(timeMultiplierTime > 0)
             {
                 timeMultiplierTime -= Time.deltaTime;
                 if (timeMultiplierTime <= 0)
                 {
                     timeMultiplierTime = 0;
                     timeMultiplier = 1f;
                 }                          
             }
             if (coinsMultiplierTime > 0)
             {
                 coinsMultiplierTime -= Time.deltaTime;
                 if (coinsMultiplierTime <= 0)
                 {
                     coinsMultiplierTime = 0;
                     coinsMultiplier = 1f;
                 }               
             }
             if (jumpMultiplierTime > 0)
             {
                 jumpMultiplierTime -= Time.deltaTime;
                 if (jumpMultiplierTime <= 0)
                 {
                     jumpMultiplierTime = 0;
                     jumpMultiplier = 1f;
                 }               
             }
 
             m_Jump = false;
         }
         if(manager.cameraLerp)
         {
             anim.SetFloat("Forward", 0.5f);
         }
     }
 
     protected virtual void FixedUpdate()
     {
         if (!dead && manager.play)
         {
             if(!m_IsGrounded)
             {
                 HandleAirborneMovement();
             }
 
             if (!manager.cameraLerp)
             {
                 thisTransform.position = Vector3.Lerp(thisTransform.position, new Vector3(posX, thisTransform.position.y, thisTransform.position.z), 0.15f);
                
                 if (hitSpeedLoc >= speed)
                 {
                     thisTransform.Translate(0, 0, speed * Time.deltaTime);
                 }
                 else
                 {
                     thisTransform.Translate(0, 0, hitSpeedLoc * Time.deltaTime);
                     hitSpeedLoc += Time.fixedDeltaTime * hitSpeedDecreaseSpeed;
                 }
             }
 
             if (!manager.cameraLerp)
                 manager.cameraTransform.position = new Vector3(manager.cameraTransform.position.x, manager.cameraTransform.position.y, transform.position.z + cameraPosition.z);
             else           
                 manager.cameraTransform.position = Vector3.Lerp(manager.cameraTransform.position, new Vector3(manager.cameraTransform.position.x, manager.cameraTransform.position.y, transform.position.z + cameraPosition.z), cameraSpeed * 3f);                          
 
             manager.cameraTransform.position = Vector3.Lerp(manager.cameraTransform.position, new Vector3(thisTransform.position.x, thisTransform.position.y + cameraPosition.y, thisTransform.position.z + cameraPosition.z), cameraSpeed);
         }
         if (manager.play)
         {
             if (!manager.cameraLerp)
             {                                
                 if (manager.pursuitTimeLoc > 0)
                 {
                     if(!dead)
                     {
                         manager.pursuerTransform.position = Vector3.Lerp(manager.pursuerTransform.position, new Vector3(manager.pursuerTransform.position.x, manager.pursuerTransform.position.y, transform.position.z - pursuerPositionOffset), 0.4f);
                         manager.pursuerTransform.position = Vector3.Lerp(manager.pursuerTransform.position, new Vector3(thisTransform.position.x, thisTransform.position.y, thisTransform.position.z - pursuerPositionOffset), 0.1f);
                     }
                     else
                     {
                         manager.pursuerTransform.position = Vector3.Lerp(manager.pursuerTransform.position, new Vector3(thisTransform.position.x, thisTransform.position.y, thisTransform.position.z - (pursuerPositionOffset - 1f)), 0.1f);
                     }
                 }
                 else if (manager.pursuitTimeLoc < -5f)
                 {
                     manager.pursuerTransform.position = Vector3.Lerp(manager.pursuerTransform.position, new Vector3(thisTransform.position.x, thisTransform.position.y, thisTransform.position.z - 10.0f), 0.1f);
                 }
 
                 if(manager.pursuitTimeLoc > -5f)
                     manager.pursuitTimeLoc -= Time.fixedDeltaTime;
             }
             else
                 manager.pursuerTransform.position = Vector3.Lerp(manager.pursuerTransform.position, new Vector3(thisTransform.position.x, thisTransform.position.y, thisTransform.position.z - pursuerPositionOffset), 0.1f);
         }
     }
 
     protected virtual void CheckGroundStatus()
     {
         RaycastHit hitInfo;
 
         // 0.3f is a small offset to start the ray from inside the character
         // it is also good to note that the transform position in the sample assets is at the base of the character
         if (Physics.Raycast(thisTransform.position + (Vector3.up * 0.3f), Vector3.down, out hitInfo, m_GroundCheckDistance + 0.3f, levelLayer))
         {            
             m_GroundNormal = hitInfo.normal;
             m_IsGrounded = true;
             //m_Animator.applyRootMotion = true;
         }
         else
         {
             m_IsGrounded = false;
             m_GroundNormal = Vector3.up;
             //m_Animator.applyRootMotion = false;
         }
     }
 
     protected virtual void HandleAirborneMovement()
     {
         // apply extra gravity from multiplier:
         Vector3 extraGravityForce = (Physics.gravity * 9f) - Physics.gravity;
         m_Rigidbody.AddForce(extraGravityForce);
 
         m_GroundCheckDistance = m_Rigidbody.velocity.y < 0 ? m_OrigGroundCheckDistance : 0.01f;
     }
 
     protected virtual void HandleGroundedMovement(bool jump)
     {
         // check whether conditions are right to allow a jump:
         if (jump)
         {
             // jump!
             audioSource.PlayOneShot(jumpClip);
             m_Rigidbody.velocity = new Vector3(m_Rigidbody.velocity.x, m_JumpPower * jumpMultiplier, m_Rigidbody.velocity.z);
             m_IsGrounded = false;
             m_GroundCheckDistance = 0.1f;
         }
     }
 
     protected virtual void OnTriggerEnter(Collider other)
     {
         if (!dead)
         {
             if (other.tag == "Bonus")
             {                
                 Bonus bonus = other.GetComponent<Bonus>();
                 Transform effect = Instantiate(bonus.effect, thisTransform.position + Vector3.up * capsuleColliders[0].center.y, Quaternion.identity).transform;
                 effect.SetParent(thisTransform);
 
                 if (bonus.sound != null)
                 {
                     audioSource.PlayOneShot(bonus.sound);
                 }
 
                 if (bonus.isCoin)
                 {
                     coins += (int)(bonus.multiplier * coinsMultiplier);
                 }
                 else if (bonus.isTimeMultiplier)
                 {
                     if(timeMultiplier < bonus.multiplier)
                         timeMultiplier = bonus.multiplier;
                     timeMultiplierTime += bonus.time;
                 }
                 else if (bonus.isCoinsMultiplier)
                 {
                     if (coinsMultiplier < bonus.multiplier)
                         coinsMultiplier = bonus.multiplier;
                     coinsMultiplierTime += bonus.time;
                 }
                 else if (bonus.isJumpMultiplier)
                 {
                     if (jumpMultiplier < bonus.multiplier)
                         jumpMultiplier = bonus.multiplier;
                     jumpMultiplierTime += bonus.time;
                 }
 
                 other.GetComponent<Collider>().enabled = false;
                 Destroy(other.gameObject);
                 
                 manager.coinsScore.text = coins.ToString();
             }
         }
     }
 
     public virtual void SaveRecords()
     {                
         PlayerPrefs.SetInt("Coins", PlayerPrefs.GetInt("Coins") + coins);
         manager.CoinsTxt.text = (PlayerPrefs.GetInt("Coins")).ToString();
 
         manager.GameOverCoinsTxt.text = manager.CoinsTxt.text;
 
         coins = 0;
 
         manager.gameOverScoreTxt.text = (time * timeScoreMultiplier).ToString("F0");
 
         if (float.Parse(manager.maxTimeScore.text) < (time * timeScoreMultiplier))
         {
             manager.maxTimeScore.text = (time * timeScoreMultiplier).ToString("F0");
             manager.congratulationsTxt.enabled = true;
 
             PlayerPrefs.SetFloat("MaxTimeScore", (time * timeScoreMultiplier));
         }
         else
             manager.congratulationsTxt.enabled = false;
 
         PlayerPrefs.Save();
     }
 
     protected virtual void GameOver()
     {
         audioSource.PlayOneShot(gameOverClip);
 
         manager.SettingsBtn.SetActive(true);
         manager.GamePanel.SetActive(false);
         manager.GameOverPanel.SetActive(true);
         dead = true;
         m_IsGrounded = true;
         anim.SetBool("GameOver", true);
 
         SaveRecords();
     }
 
     protected virtual void OnCollisionEnter(Collision other)
     {
         if (!dead)
         {
             //GameOver
             if (other.collider.tag != "Bonus" && (other.contacts[0].normal.z < -0.8f && other.contacts[0].normal.z > -1.2f))
             {
                 bool gameOver = false;
                 for (int i = 0; i < other.contacts.Length; i++)
                 {
                     if (other.contacts[i].thisCollider == m_Collider)
                     {
                         gameOver = true;
                         break;
                     }
                 }
                 if (gameOver)
                 {
                     GameOver();
                     Debug.Log("GameOver");
                 }
                 else
                 {
                     if (manager.pursuitTimeLoc > 0)
                     {
                         GameOver();
                         Debug.Log("GameOverHit");
                     }
                     else
                     {
                         manager.pursuitTimeLoc = manager.pursuitTime;
                         hitSpeedLoc = initialHitSpeed;
                         Debug.Log("LightHit");
                     }
                 }              
             }
         }
     }
 }
 

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

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.

Follow this Question

Answers Answers and Comments

189 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

Related Questions

The name 'Joystick' does not denote a valid type ('not found') 2 Answers

Mouse Swipe and Code Efficiency 0 Answers

My player swipes faster on iOS then android 1 Answer

swipe distance detection dont work 2 Answers

Making a bubble level (not a game but work tool) 1 Answer


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