Unity: Distance between two game-objects in the scene view - unity3d

I am new to Unity and as I am creating my interface, I am trying to find what's the distance between two game objects. I know how to do in a C#/javascript script, however I am strugling to find this information in the scene view. Any key I could press while moving an object to see the distance to its neighbours ?

In a script, you can use Vector3.Distance between vector3 to get the distance between two points. Every gameObject has a position that is represented in a Vector3.
Below is a script example that shows you how it works. You just have to drag the script onto a gameObject in your scene and drag in the inspector another gameobject in your scene. The script should run even when your not in play mode because of the [ExecuteInEditMode].This way you will see the distanceBetweenObjects update in real time without actually having to hit play.
using UnityEngine;
[ExecuteInEditMode]
public class DistanceBetweenTwoObjects : MonoBehaviour
{
public GameObject obj;
public float distanceBetweenObjects;
private void Update()
{
distanceBetweenObjects = Vector3.Distance(transform.position, obj.transform.position);
Debug.DrawLine(transform.position, obj.transform.position, Color.green);
}
private void OnDrawGizmos()
{
GUI.color = Color.black;
Handles.Label(transform.position - (transform.position -
obj.transform.position)/2, distanceBetweenObjects.ToString());
}
}
The method OnDrawGizmos will draw text in between the 2 objects showing the distance value to help make it more user friendly.

There isn't any built-in functionality for this, but it's fairly trivial to add such a readout into the display using [ExecuteinEditMode], which causes scripts to run even when the game is not in play mode. This script, for example, should readout the distances on different axes and in total:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[ExecuteInEditMode]
public class EditorDistanceDisplay : MonoBehaviour
{
public GameObject target1;
public GameObject target2;
public float distanceX;
public float distanceY;
public float distanceZ;
public float distanceTotal;
void Start()
{
}
void Update()
{
Vector3 delta = target2.transform.position - target1.transform.position;
distanceX = delta.x;
distanceY = delta.y;
distanceZ = delta.z;
distanceTotal = delta.magnitude;
}
}

Related

Shooting bullets in unity2D

I'm trying to shoot bullets in a 2D top-down-shooter game but they just stay rest and doesnt move
I tried to add "addforce" but they didnt move. I changed it with "new Vector2" but that time it doesnt follow my cursor. istead of it shoots in a different same direction.I want to shoot to my cursor. and if possible I want to add a fire delay between object and make it possible to attack repeatly while holding mouse left button.
`
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Shooting : MonoBehaviour
{
public Transform firePoint;
public GameObject bulletPrefab;
public float bulletForce = 15f;
void Update()
{
if (Input.GetButtonDown("Fire1"))
Shoot();
}
void Shoot()
{
GameObject bullet = Instantiate(bulletPrefab,firePoint.position, firePoint.rotation);
Rigidbody2D rb = bullet.GetComponent<Rigidbody2D>();
rb.AddForce(firePoint.right* bulletForce, ForceMode2D.Impulse);
}
}//class
`

Trying to make a VR fps game in Unity, but my gun is randomly inaccurate

Newbie to unity and vr here.
I recently got started with Valem's unity tutorial for VR, but I've hit a snag:
In his part 5 video where he explains how to pick up and interact with objects, the code he uses for the gun results in the bullets being very inaccurate when I used it.
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem.XR;
public class Gun : MonoBehaviour
{
public float speed = 40;
public GameObject bullet;
public Transform barrel;
public AudioSource audioSource;
public AudioClip audioClip;
public void Fire()
{
GameObject spawnedBullet = Instantiate(bullet, barrel.position, barrel.rotation);
spawnedBullet.GetComponent<Rigidbody>().AddForce(transform.forward * speed);// = speed * barrel.forward;
audioSource.PlayOneShot(audioClip);
Destroy(spawnedBullet, 2);
}
}
In his video his gun fires accurately, but for me it randomly shoots in a different direction (usually forward but rarely straight).
Really need help, I've been hitting my head against this one all day.

OnCollisionEnter Change Text when triggered

I'm very new to Unity, but not to C#. I'm looking to make a simple solution where when i move a ball into a hole - an event is triggered. The event in this case is changing the text of a TMPro object. I'm seeing nothing being returned when these 2 objects interact using the below code.... Looking for any help on this. More context can be given if needed.
Hole.cs
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using TMPro;
public class Hole : MonoBehaviour
{
// Update is called once per frame
[SerializeField]
private Collision collision;
private TextMeshProUGUI text;
private void Start()
{
text = GetComponent<TextMeshProUGUI>();
}
void Update()
{
//text.text = "Hole hit!";
}
public void OnCollisionEnter(Collision collision)
{
text.text = "Hole hit!";
}
}
BallMover.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BallMover : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
float horizontal = Input.GetAxis("Horizontal");
float vertical = Input.GetAxis("Vertical");
Vector3 movement = new Vector3(horizontal, vertical);
transform.position += movement * Time.deltaTime;
}
}
Thanks in advance
The Error below "Object Reference not set to instance of an object" is coming up when these 2 object collide...
You need to check are there colliders in both objects.
Collision is a physical event for this reason you have to move the ball with physics, if you move it with transform, it is very likely that you will miss the physics events.
You have to add a "Rigidbody" component to the ball to move physically.
So as you said in a comment you already checked that
You are using Rigidbody
Both objects have Collider components
So additionally make sure
both Collider components are set to IsTrigger = false
Whenever there is physics and Rigidbody involved you do not want to set stuff via transform in Update as this breaks the physics and collision detection! Rather use Rigidbody.MovePosition within FixedUpdate
so something like e.g.
public class BallMover : MonoBehaviour
{
[SerializeField] private Rigidbody _rigidbody;
private void Awake ()
{
if(!_rigidbody) _rigidbody = GetComponent<Rigidbody>();
}
private void FixedUpdate()
{
var horizontal = Input.GetAxis("Horizontal");
var vertical = Input.GetAxis("Vertical");
var movement = new Vector3(horizontal, vertical);
_rigidbody.MovePosition(_rigidbody.position + movement * Time.deltaTime);
}
}

2D Ragdoll movement in unity

I tried make a Ragdoll game with my brother but
the problem is that we try make a Ragdoll movement and we can make a movement but
when we try this movement on the Ragdoll It just goes pretty normal. we know we need bones and things like that but we don't know how can we make A script like that. we don't want see tutorials on YouTube we want to make a script that how We want to be.
Anyone have any idea how we can do that?
Oh and I know when I wrote this there were some spelling errors in the above code so sorry for that.
here's our script:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Movement : MonoBehaviour
{
// Start is called before the first frame update
public float force;
public Rigidbody2D body;
public Leg[] legs;
void Start()
{
}
// Update is called once per frame
void Update()
{
if (Input.GetKey(KeyCode.D))
{
Vector2 vec = Vector2.right * force;
body.AddForce(vec);
foreach (Leg leg in legs)
{
leg.Walk();
}
}
}
}
[System.Serializable]
public class Leg
{
public Rigidbody2D bone;
public float walkRotation;
public float force;
public void Walk()
{
bone.MoveRotation(Mathf.LerpAngle(bone.rotation, walkRotation, force * Time.deltaTime));
}
}
Use animations for different movements it will save you a lot of time. If you want the Rag doll effect enable it after the Player dies. So, in animations you should check blend trees if you want different animations for different speeds or locations etc. All game characters move as one Object and the rest is done in Animations. It is much simpler and efficient.

changing rigidbody.mass value in unity 3 D

I am trying to change mass of a 3D object programmatically. But the object doesn't get the calculated mass but a 0 value initially. When the prefab of the object is created it gets the calculated mass of the previous object not the current mass. And the scenario repeats for all the prefabs created henceforth. How can I get around this problem? Any help is greatly appreciated.
You're probably missing a get component call:
using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour {
public float mass;
public Rigidbody rb;
void Start() {
rb = GetComponent<Rigidbody>();
rb.mass = 0.5f;
}
}
To give your rigidbody a mass can use the following script wise
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
void Example() {
rigidbody.mass = 0.5F;
}
}
Next time do some more research.
http://docs.unity3d.com/Documentation/ScriptReference/Rigidbody-mass.html
Google first hit.