- Home /
SOLVED - How to access variable from another script for Instantiate prefab
script is attached to empty GO-create characters in circle positions (ringspawn1.js)
script is attachet to prefab character (move1.js)
How to assign endPosition Vector3 from ringspawn1.js script to each individual character in move1.js script ? Using static variable index from ringspawn1.js in second script doesn't work properly.
#pragma strict
static var index : int;
var count : int = 7;
var radius : float = 25.0;
var angleOffset : float = 0.0;
var prefab : Transform;
var agents : ArrayList;
var targets : ArrayList;
private var pos : Vector3;
private var rot : Quaternion;
function Start () {
agents = new ArrayList();
targets = new ArrayList();
for (var i=0;i<count;i++) {
index = i;
var angle : float = i;
angle /= count;
rot = Quaternion.Euler(0, angle * 360.0 + angleOffset, 0);
pos = rot * Vector3.forward * - 1 * radius;
var newAgent = Instantiate(prefab, pos + transform.position, rot);
agents.Add(newAgent.gameObject);
var target = new GameObject("Target" + index).transform;
target.position = rot * Vector3.forward * 20 + newAgent.transform.position + Vector3(0,2,0);
targets.Add(target.transform);
}
}
#pragma strict
private var desiredVelocity : Vector3;
private var lastSqrMag : float;
private var Speed1 : float = 2.2;
private var startPosition : Vector3;
private var endPosition : Vector3;
function Start () {
startPosition = transform.position;
endPosition = GameObject.Find("Target" + ringspawn1.index).transform.position;
var directionalVector : Vector3 = (endPosition - transform.position).normalized * Speed1;
lastSqrMag = Mathf.Infinity;
desiredVelocity = directionalVector;
}
function Update()
{
var sqrMag : float = (endPosition - transform.position).sqrMagnitude;
if ( sqrMag > lastSqrMag )
{
desiredVelocity = Vector3.zero;
}
lastSqrMag = sqrMag;
}
function FixedUpdate()
{
rigidbody.velocity = desiredVelocity;
}
$$anonymous$$gest you consult the official tutorials on scripting: http://unity3d.com/learn/tutorials/modules/beginner/scripting
this question has been asked many times
every time it is 'how to access a variable on another script'
p.s.: it's "how do i"
you need to have an object of move1 and then you can use it however you want.
var ob : move1 = Instantiate(stuff)
ob.thing = 7;
Answer by potter3366 · Jul 29, 2013 at 12:36 PM
// ringspawn1.js
#pragma strict
static var objects : GameObject[];
static var objectsTransform : Transform[];
var count : int = 7;
var radius : float = 40.0;
var angleOffset : float = 0.0;
var prefab : Transform;
@HideInInspector
var index : int;
var targets : ArrayList;
private var pos : Vector3;
private var rot : Quaternion;
function Start () {
objects = new GameObject[count];
objectsTransform = new Transform[count];
targets = new ArrayList();
for (var i=0;i<count;i++) {
index = i;
var angle : float = i;
angle /= count;
rot = Quaternion.Euler(0, angle * 360.0 + angleOffset, 0);
pos = rot * Vector3.forward * - 1 * radius;
var thisObject = Instantiate(prefab, pos + transform.position, rot);
thisObject.name = "beggar" + i;
var target = new GameObject("Meta" + i).transform;
target.position = rot * Vector3.forward * 35 + thisObject.transform.position + Vector3(0,2,0);
targets.Add(target.transform);
puniPolje(i, thisObject.gameObject, target.transform);
}
}
function puniPolje (ii : int, g : GameObject, t : Transform)
{
objects[ii] = g;
objectsTransform[ii] = t;
}
// move1.js
#pragma strict
private var Speed1 : float = 2.2;
private var startPosition : Vector3;
private var endPosition : Vector3;
private var startTime: float;
private var journeyLength: float;
private var myHit : RaycastHit;
private var offsetAlign : float = 0.1;
function Start ()
{
startTime = Time.time;
startPosition = transform.position;
for (var i=0;i<ringspawn1.objectsTransform.Length;i++) {
if(name == "beggar" + i) endPosition = ringspawn1.objectsTransform[i].position;
}
journeyLength = Vector3.Distance(startPosition, endPosition);
}
function Update()
{
var distCovered = (Time.time - startTime) * Speed1;
var fracJourney = distCovered / journeyLength;
transform.position = Vector3.Lerp(startPosition, endPosition, fracJourney);
if(Physics.Raycast (transform.position, Vector3.down, myHit))
{
transform.position.y = myHit.point.y + offsetAlign;
}
}
Answer by abeldantas · Jul 28, 2013 at 11:28 PM
I think I'm not understanding your question, but I'll bite:
In move.js declare a Gameobject to hold your empty Go that has ringspawn1.js attached:
var ringspawnGO : Gameobject;
Don't forget to assign the gameObject to this variable in the editor. Then instead of :
GameObject.Find("Target" + ringspawn1.index).transform.position;
You can do:
lastOneIndex = ringspawnGO.GetComponent("ringspawn1").count;
lastGO = GameObject.Find("Target" + lastOneIndex);
endPosition = lastGo.transform.position;
This approach has a problem, you need to link your ringspawnGO to the script in your prefab. If you use your prefab in another scene, you will need to change the link manually. To access gameobject more dynamically you can use GameObject.Find (works by name) or GameObject.FindGameObjectsWithTag.
Additionally you shouldn't name your scripts with numbers, names should describe what you are implementing.