- Home /
Spawning an object attached to one object, drawn to another.
I have a game where the player score while getting next to an object. I want to create a line that shoots from the player to the enemy as the player has entered that range.
It seems like Distance Joint 2D does something SIMILAR to what I want, but not quite.
I don't see a clear way to do it, but I'll certainly hack at more of it tonight.
I made a beautiful picture to further explain what I'm asking, 'cause I feel like I did a poor job. I want to use this as feedback to let the player know they've scored.
Answer by robertbu · Aug 19, 2014 at 05:04 AM
Here is a bit of example code. To test it
Start a new scene
Create a Quad and set the x scale to the width of the line you want.
Attach the script below to the Quad
Crate two game object that are no more that 'breakDistance' apart (default 5 units).
Drag and drop the two game objects onto the 'start' and 'end' variables.
Run the app and hit the space bar to connect the line.
Move one of the game objects so they are more than 'breakDistance' apart to break the line.
using UnityEngine; using System.Collections;
public class LinePulse : MonoBehaviour { public float pulseTime = 1.0f; public float breakDistance = 5.0f; public Transform start; public Transform end;
private bool pulsing = false;; void Start() { renderer.enabled = false; } void Update () { if (Input.GetKeyDown(KeyCode.Space)) { StartCoroutine(Pulse(pulseTime)); } } IEnumerator Pulse(float time) { if (pulsing) yield break; pulsing = true; renderer.enabled = true; Vector3 scale = transform.localScale; bool broken = false; float timer = 0.0f; while (timer <= 1.0f) { Vector3 dir = end.position - start.position; float dist = dir.magnitude; transform.rotation = Quaternion.FromToRotation (Vector3.up, dir); float yScale = Mathf.PingPong(timer * 2.0f, 1.0f); scale.y = yScale * dist; transform.localScale = scale; transform.position = Vector3.Lerp (start.position, end.position, timer); if (!broken && timer > 0.5f && dist > breakDistance) broken = true; if (timer < 0.5 || broken) timer += Time.deltaTime / time; yield return null; } pulsing = false; renderer.enabled = false; } }
For your app, you'll likely have to set things up a bit differently, but this gives you some sample code that solves the line connecting and breaking.
It seems to work, I swapped out the quad for my sprite and it seems to work fine in my game, awesome!
I'd upvote you but my rep is too low <3
The code will work fine with any world object that has a height of 1 unit. The height is not 1 unit, then either the code needs to change just a bit or you need to use an empty game object parent with a child sized to a height of 1 unit.