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 /
  • Help Room /
avatar image
0
Question by chris9510 · Apr 15, 2018 at 01:00 AM · movementairaycastingnull

Raycast only returns null

Hey I am trying to make an ai raycast for to do movement but my raycast is only returning null, i had the code working before and then was working on implementing difficulty to it, for example hard can see further than easy or normal, i then took the raycast and did it on the oposit side also (i was thinking if an ai has been downed but still alive and another ai is near then they can change the target to that ai instead of the player and though if the player was close to their back on the likes of hard it will focus on the player first). After implementing this though now my raycast is always returning empty.

Please help as I have no idea why this is happening, though want to make it custom and not the navmesh as more to talk about in my project basically.

All Scripts used

MovementAI Script

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using UnityEngine.AI;

using System.Reflection;

public class MovementAI : MonoBehaviour {

 DifficultyLevel myEnum;



 private GameObject target;
 public Transform transformDistance;
 private AiActionsControl AiActionScript;
 private theCloud cloudScript;

 // public bool moveObject;
 private bool isInPlayersRange, isHitTarget; // if in close enough range will start raycasts on // could do collider on player or get players range may do colider
 private bool doOnceBool = true;

 public float movementSpeed = 0.25f;
 private float targetDirection = -1; // -1 is to the left +1 is to the right

 public string targetTagString = "Player";

 public float easyLineOfSightDistance = 5, normalLineOfSightDistance = 7.5f, hardLineOfSightDistance = 10;
 private float currentLineOfSightDistance = 0;
 private float currentLOS2;

 public float easyAttackRangeDistance = 3, normalAttackRangeDistance = 2f, hardAttackRangeDistance = 1;
 private float currentAttackRangeDistance = 0;

 private GroundCollision groundCollisionScript;
 private string groundCollisionInstantiateString;
 public GameObject goCollis;
 //  public bool isGrounded;

 void Awake()
 {
     //   printError(MethodBase.GetCurrentMethod());
     target = GameObject.FindGameObjectWithTag(targetTagString);

     if (gameObject.GetComponent<AiActionsControl>() == null)
         gameObject.AddComponent<AiActionsControl>();
     AiActionScript = GetComponent<AiActionsControl>();

     if (gameObject.GetComponentInChildren<GroundCollision>() == null)
         Instantiate(goCollis, transform); //(Resources.Load("Assets/GroundCollisionSpriteFeet"));//Prefabs/Managers   // gameObject.AddComponent<GroundCollision>();
                                           //  Instantiate(goCollis,transform); 
     groundCollisionScript = GetComponentInChildren<GroundCollision>();


 }

 void printError(MethodBase functionFrom)
 {
     string objectName = transform.name.Replace("(Clone)", "");

     MonoBehaviour thisScriptName = this.GetComponent<MonoBehaviour>();
     Debug.LogWarning("!!! YEAAAA it done goofed, in (" + objectName.ToUpper()
         + ") game object on Script ("
         + this.GetType().ToString().ToUpper()
         + ") In the (" + functionFrom.ToString() + ") function");
 }
 // Use this for initialization
 void Start()
 {
     cloudScript = FindObjectOfType<theCloud>();
     if (cloudScript.GetComponent<theCloud>() == null)
     {
         //  cloudScript.GetComponent<theCloud>();
         printError(MethodBase.GetCurrentMethod());
     }

 }
 public float speed;
 // Update is called once per frame
 void Update()
 {

     /*

         if (Vector3.Distance(transform.position, target.transform.position) < 100)
         {
             print("player is close");

             transform.position = (target.transform.position - transform.position).normalized * speed * Time.deltaTime;
         }
         else
         {
             print("not close yet");
             print(Vector3.Distance(transform.position, target.transform.position));
     }


     */


     //       if (myEnum != cloudScript.currentDificultyLevelEnum)
     //           myEnum = cloudScript.currentDificultyLevelEnum;
     //   if (groundCollisionScript.isGrounded)
     {
         FindTargetDirection();
         searchRaysPatrolStart();
         //   raycastMethod();
     }

 }


 void FindTargetDirection()
 {

     if (target.transform.position.x < transform.position.x)
         targetDirection = -1;   // Target Left
     else targetDirection = 1;   // Target Right

 }



 void searchRaysPatrolStart()
 {
     #region Debug switch difficulty
     // this should be searching left and right the range length of sight to see if can see player
     // incorperate games difficulty if easy they cant see as far, if hard they can see full screen
     if (targetDirection == -1) // left
     {
         switch (cloudScript.currentDificultyLevelEnum)
         {
             case DifficultyLevel.Easy:
                 Debug.Log("!!!!!!!!!!!!" + cloudScript.currentDificultyLevelEnum);

                 currentLineOfSightDistance = easyLineOfSightDistance;
                 currentAttackRangeDistance = easyAttackRangeDistance;

                 break;
             case DifficultyLevel.Normal:
                 Debug.Log("!!!!!!!!!!!!" + cloudScript.currentDificultyLevelEnum);

                 currentLineOfSightDistance = normalLineOfSightDistance;
                 currentAttackRangeDistance = normalAttackRangeDistance;

                 break;
             case DifficultyLevel.Hard:
                 Debug.Log("!!!!!!!!!!!!" + cloudScript.currentDificultyLevelEnum);

                 currentLineOfSightDistance = hardLineOfSightDistance;
                 currentAttackRangeDistance = hardAttackRangeDistance;

                 break;
             default:
                 printError(MethodBase.GetCurrentMethod());
                 break;

         }


     }
     else
     {// 1 equals to the right

         switch (cloudScript.currentDificultyLevelEnum)
         {
             case DifficultyLevel.Easy:
                 Debug.Log("!!!!!!!!!!!!" + cloudScript.currentDificultyLevelEnum);
                 break;
             case DifficultyLevel.Normal:
                 Debug.Log("!!!!!!!!!!!!" + cloudScript.currentDificultyLevelEnum);

                 break;
             case DifficultyLevel.Hard:
                 Debug.Log("!!!!!!!!!!!!" + cloudScript.currentDificultyLevelEnum);

                 break;
             default:
                 printError(MethodBase.GetCurrentMethod());
                 break;

         }

     }
     #endregion

     #region past workings
     /*  

switch(cloudScript.DifficultyLevel) { case theCloud.DifficultyLevel.Easy: break;

} */

     /*

     switch (cloudScript.currentDifLevelInt)
     {
         case 1:

             currentLineOfSightDistance = -easyLineOfSightDistance;
             break;
         case 2:
             currentLineOfSightDistance = -normalLineOfSightDistance;

             break;
         case 3:
             currentLineOfSightDistance = -hardLineOfSightDistance;

             break;
         default:
             printError(MethodBase.GetCurrentMethod());
             break;

     }



             switch (cloudScript.currentDifLevelInt)
     {
         case 1:

             currentLineOfSightDistance = easyLineOfSightDistance;
             break;
         case 2:
             currentLineOfSightDistance = normalLineOfSightDistance;

             break;
         case 3:
             currentLineOfSightDistance = hardLineOfSightDistance;

             break;
         default:
             printError(MethodBase.GetCurrentMethod());
             break;

     }


     */


     //       switch(cloudScript.currentDificultyLevelEnum)
     //    {
     //     case cloudScript.currentDificultyLevelEnum.ToString().Equals("Easy"):
     //           Debug.LogWarning(" MOVE AI IS SET TO EASY");
     //          break;
     //      default:
     //          Debug.LogWarning(" MOVE AI IS not SET TO EASY");
     //          break;
     //   }

     //sight 10 hard






     //          if (myEnum == DifficultyLevel.Easy)
     //          {
     //             Debug.Log("!!!!!!!!!!!" + myEnum);
     //          }
     //         if (myEnum == DifficultyLevel.Easy)
     //          {
     //             Debug.Log("!!!!!!!!!!!" + myEnum);
     //          }
     #endregion


     //   float currentLoSDistance2;

     #region Actual Workings
     if (targetDirection < 0)
     {
         //    targetDirection = -1 minus 1 is left
         //            currentAttackRangeDistance = easyAttackRangeDistance normalAttackRangeDistance hardAttackRangeDistance

         /*
         if (cloudScript.currentDificultyLevelEnum == DifficultyLevel.Easy)
         {
             currentLineOfSightDistance = transform.position.x - easyLineOfSightDistance;
             // currentLineOfSightDistance = easyLineOfSightDistance;
             currentAttackRangeDistance = easyAttackRangeDistance;

         }
         if (cloudScript.currentDificultyLevelEnum == DifficultyLevel.Normal)
         {

             currentLineOfSightDistance = normalLineOfSightDistance;
             currentLineOfSightDistance = transform.position.x - normalLineOfSightDistance;
             currentAttackRangeDistance = normalAttackRangeDistance;

         }
         if (cloudScript.currentDificultyLevelEnum == DifficultyLevel.Hard)
         {

             currentLineOfSightDistance = hardLineOfSightDistance;
             currentLineOfSightDistance = transform.position.x - hardLineOfSightDistance;
             currentAttackRangeDistance = hardAttackRangeDistance;

         }

     }
     else
     {
         if (cloudScript.currentDificultyLevelEnum == DifficultyLevel.Easy)
         {
             currentLineOfSightDistance = transform.position.x + easyLineOfSightDistance;
             // currentLineOfSightDistance = easyLineOfSightDistance;
             currentAttackRangeDistance = easyAttackRangeDistance;

         }
         if (cloudScript.currentDificultyLevelEnum == DifficultyLevel.Normal)
         {

             //     currentLineOfSightDistance = normalLineOfSightDistance;
             currentLineOfSightDistance = transform.position.x + normalLineOfSightDistance;
             currentAttackRangeDistance = normalAttackRangeDistance;

         }
         if (cloudScript.currentDificultyLevelEnum == DifficultyLevel.Hard)
         {

             //    currentLineOfSightDistance = hardLineOfSightDistance;
             currentLineOfSightDistance = transform.position.x + hardLineOfSightDistance;
             currentAttackRangeDistance = hardAttackRangeDistance;

         }
         //currentLineOfSightDistance = -currentLineOfSightDistance;
                     */
     }
     currentLOS2 = currentLineOfSightDistance * -1;


     #endregion





     #region Past Workings 2


     //     RaycastHit2D oposTestRayHit2D = Physics2D.Linecast(transform.position, new Vector3(transform.position.x + currentLOS2, transform.position.y, 0), gameObject.layer - 3); // transformDistance.position)
     //      Debug.DrawLine(transform.position, new Vector3(transform.position.x + currentLOS2, transform.position.y, 0), Color.blue); //new Vector3( transform.position.x-5, transform.position.y,0), Color.yellow);


     //  Raycast2D rayName =(new Vector3(gameObject.transform.x, gameObject.transform.y, 0), new Vector3(currentLineOfSightDistance, gameObject.transform.y, 0) end, GameObject.layer)
     //       Debug.DrawLine(gameObject.transform.position, new Vector3(currentLineOfSightDistance, transform.position.y, 0), Color.green);





     //   Debug.Log("!!!!!!!!!!!!" + cloudScript.currentDificultyLevelEnum);


     // this part ends after they see the player (a collision, left or right, hits the player then turns off other side,
     // if hit left turns off right save resources, and starts moving towards if still hitting)

     // will also start a in range check of another raycast (or get distance whatever is least demand though raycast 
     // could do ai help each other or ai companion of player)

     // this will be one unit above (or however is is enough to not collide with the )

     #endregion
     //   raycastMethod();

     customRaycastStuff();

 }




    public string stringOfLayerNameToIgnore = "GroundTop"; // this can be changed
 public RaycastHit2D testRayHit2D;
 private LayerMask thisLayerMask;
 void customRaycastStuff()
 {
     thisLayerMask = 1 << gameObject.layer; //LayerMask.NameToLayer(stringOfLayerNameToIgnore);

     Debug.DrawRay(transform.position, new Vector3(targetDirection, 0, 0) * currentLineOfSightDistance, Color.yellow);   //  Yellow is Sight


     // RaycastHit2D testRayHit2D = Physics2D.Linecast(transform.position, new Vector3(currentLineOfSightDistance, transform.position.y, 0), gameObject.layer - 3); // transformDistance.position)

     testRayHit2D =  Physics2D.Linecast(transform.position, new Vector3(targetDirection, 0, 0) * currentLineOfSightDistance, 1 << LayerMask.NameToLayer("GroundTop") | 1<< LayerMask.NameToLayer("GroundMid") | 1 << LayerMask.NameToLayer("GroundBottom") | 1 << LayerMask.NameToLayer(stringOfLayerNameToIgnore));

     if (testRayHit2D.collider == null)
         Debug.LogWarning("IT HIT nothing LEFT : " + testRayHit2D);

     if (testRayHit2D.collider != null)
     {

         if (testRayHit2D.collider.tag == "Player") ;
         Debug.Log("IT HIT THE PLAYER ON LEFT : "+testRayHit2D);
     }

 }


 void raycastMethod()
 {

     //  Within this I will use the values to flip to make sure that it is both a) easier to read and understand for when i enevatably have to backtrack and b) easier on resources
     //  My default thinking though is that the enemy is on the right looking to the target on its left

     Vector3 raySpawnPointLeft = new Vector3(0, 0, 0);               //  This is the point that the ray will start at, gun nosel
     raySpawnPointLeft = transform.position;
     Vector3 rayShootDirectionLeft = new Vector3(targetDirection, 0, 0);           //  This is the direction the ray will go out to, bullet trail
     Vector3 rayShootDirectionRight = new Vector3(-targetDirection, 0, 0);           //  This is the direction the ray will go out to, bullet trail
     RaycastHit leftRayHitInfo, rightRayHitInfo;

     float distanceToShootTheRay;
     distanceToShootTheRay = currentLineOfSightDistance;

     //     currentLineOfSightDistance

     if (targetDirection < 0)
     {
         //    targetDirection = -1 minus 1 is left
         //            currentAttackRangeDistance = easyAttackRangeDistance normalAttackRangeDistance hardAttackRangeDistance


         if (cloudScript.currentDificultyLevelEnum == DifficultyLevel.Easy)
         {


         }

     }

     int currentLayerToIgnoreSelf = gameObject.layer - 3; // this worked with linecasts dont know about raycasts

     /*
     if(targetDirection<0)//left
     {
         rayShootDirectionLeft = new Vector3(-1, 0, 0);
     }
     else
     {
         rayShootDirectionLeft = new Vector3(1, 0, 0);
     }
     */
     /* 
     Debug.DrawRay(raySpawnPointLeft, rayShootDirectionLeft * distanceToShootTheRay, Color.blue);
              //   THIS DIDNT WORK BUT SECOND DID
     Ray leftRayCastLineOfSight = new Ray(raySpawnPointLeft, rayShootDirectionLeft);    //  This is to be used in the raycast to make it look cleaner
                                                                         //  Physics.Raycast(leftRayCastLineOfSight, RaycastHit leftRayHitInfo, float distance, int LayerMask);
     Physics.Raycast(leftRayCastLineOfSight, out leftRayHitInfo, distanceToShootTheRay, currentLayerToIgnoreSelf);

  //   if (leftRayHitInfo.collider.tag != null)

   //      if (leftRayHitInfo != null && leftRayHitInfo.collider != null)

     */

     Debug.DrawRay(transform.position, new Vector3(targetDirection, 0, 0) * currentLineOfSightDistance, Color.yellow);   //  Yellow is Sight
     Ray leftRayCastLineOfSight = new Ray(raySpawnPointLeft, rayShootDirectionLeft);    //  This is to be used in the raycast to make it look cleaner
                                                                                        //  Physics.Raycast(leftRayCastLineOfSight, RaycastHit leftRayHitInfo, float distance, int LayerMask);
     Physics.Raycast(transform.position, new Vector3(targetDirection, 0, 0), out leftRayHitInfo, currentLineOfSightDistance);



     Debug.DrawRay(transform.position, new Vector3(targetDirection * -1, 0, 0) * currentLineOfSightDistance, Color.blue);   //  Yellow is Sight
     Ray rightRayCastLineOfSight = new Ray(raySpawnPointLeft, rayShootDirectionRight);    //  This is to be used in the raycast to make it look cleaner
     Physics.Raycast(transform.position, new Vector3(targetDirection, 0, 0), out rightRayHitInfo, currentLineOfSightDistance);


     if (transform == null)
     {
         Debug.Log("transform is null");
     }
     if (leftRayHitInfo.collider == null)
     {
         Debug.LogError("leftRayHitInfo.collider is null " + leftRayHitInfo.collider);
     }

     if (leftRayHitInfo.collider != null)
     {
         Debug.LogError(leftRayHitInfo);
         if (leftRayHitInfo.collider.tag == target.tag) //"Player")
         {

             isHitTarget = true;
             if (AiActionScript.canMoveObject)
             {
                 // transform.position = new Vector3(transform.position.x * -movementSpeed, transform.position.y, 0);
                 transform.Translate(Vector3.right * targetDirection * movementSpeed);
             }
             else
             {
                 isHitTarget = false;
             }
         }

     }
     //  else printError(MethodBase.GetCurrentMethod());

     //    if (rightRayHitInfo.collider != null)
     //     {



     /*
     if (leftRayHitInfo.collider == null)
     {
         Debug.LogError("transform is null");
     }

     if (leftRayHitInfo.collider.tag != null)
     {

         //    if (rightRayHitInfo.collider.tag == target.tag)//"Player")
         {

         }
     }
     else printError(MethodBase.GetCurrentMethod());


     //      RaycastHit2D testRayHit2D = Physics2D.Linecast(transform.position, new Vector3(currentLineOfSightDistance, transform.position.y, 0), gameObject.layer - 3); // transformDistance.position)
     //      Debug.DrawLine(transform.position, new Vector3(currentLineOfSightDistance, transform.position.y, 0), Color.yellow); //new Vector3( transform.position.x-5, transform.position.y,0), Color.yellow);

     //  I understand it would be better doing 1 single raycast from left point to right point instead of transform to left and transform to right but this is easier to think through for myself
     //  (more demanding and easily fixed) but if i can get this to work and have time i will go back and optamize this
 
     #region Past Workings

     //      RaycastHit2D testRayHit2D = Physics2D.Linecast(transform.position, new Vector3(currentLineOfSightDistance, transform.position.y, 0), gameObject.layer - 3); // transformDistance.position)
     //      Debug.DrawLine(transform.position, new Vector3(currentLineOfSightDistance, transform.position.y, 0), Color.yellow); //new Vector3( transform.position.x-5, transform.position.y,0), Color.yellow);
     //      Debug.Log("!!!!DFFFFFFFFFD!!!!! " + testRayHit2D.distance);
     /*
             if (testRayHit2D.collider != null)
             {
                 //            if (testRayHit2D.collider.name != "PlayerRangeRays")
                 if (testRayHit2D.collider.tag == target.tag) // == target.
                 {
                     isHitTarget = true;
                     if (AiActionScript.canMoveObject)
                     {
                         // transform.position = new Vector3(transform.position.x * -movementSpeed, transform.position.y, 0);
                         transform.Translate(Vector3.right * targetDirection * movementSpeed);
                     }
                 }
                 else
                 {
                     isHitTarget = false;
                 }

             }
             Debug.Log(testRayHit2D.collider);


             if (!isHitTarget)
                 if (testRayHit2D.distance >= 2.25)
                 {
                     if (!doOnceBool)
                         doOnceBool = true;
                 }

             if (isHitTarget)
             {
                 if (testRayHit2D.distance <= 2.25)
                 {
                     if (doOnceBool)
                     {
                         doOnceBool = false;
                         movementSpeed = movementSpeed / 3;
                         //                AiActionScript.PickAction();
                     }

                 }
                 //   rb.velocity = new Vector3(-movementSpeed, 0, 0);
             }

         */
     //  #endregion

 }







}

scripts.zip (8.2 kB)
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

224 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

Related Questions

Trouble making jumping spider enemies 0 Answers

AI disappears when moving. 1 Answer

Occasional NavMeshAgent gets stuck and goes the wrong direction 1 Answer

How change the destination point if it is inside an obstacle? 0 Answers

Problem making object keep on RaycastHit point relative to another object 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