What is wrong with my script. Im geeting this errors:
Assets/Scripts/CameraController.js(30,19): BCE0019: ‘range’ is not a member of ‘Object’.
(Filename: Assets/Scripts/CameraController.js Line: 30)
Assets/Scripts/CameraController.js(30,77): BCE0019: ‘position’ is not a member of ‘Object’.
(Filename: Assets/Scripts/CameraController.js Line: 30)
Script:
#pragma strict
var cameraNodes : Array = new Array();
var target : Transform;
var loopHandle : boolean = true;
class CameraNode{
var position : Vector3;
var range : float;
function CameraNode(position:Vector3, range:float){
this.position = position;
this.range = range;
}
}
function Start () {
target = gameObject.Find("Player").transform;
while(loopHandle){
if(cameraNodes.length){
var node : int;
for( var i = 0; i < cameraNodes.length; i++){
if(cameraNodes[i].range >= Vector3.Distance(target.position, cameraNodes[i].position)){
node = i;
}
}
transform.position = cameraNodes[node].position;
}
yield WaitForSeconds(1.0);
}
}
function Update () {
transform.LookAt(target);
}
cameraNodes is an untyped array, so when you extract its elements the compiler doesn’t know what type they are.
You need to either declare it as a C#-style array:
var cameraNodes : CameraNode[];
or explicitly cast the items you pull out of it, e.g. by assigning them to a local variable before accessing the data on that:
var cameraNode = cameraNodes[i] as CameraNode;
if (cameraNode.range >= ...)
You need to make your member declarations public (at least I believe so- C# would require it and not positive on JS)
#pragma strict
var cameraNodes : CameraNode[];
var target : Transform;
var loopHandle : boolean = true;
// Also makes the class serializeable by extending System.Object
class CameraNode extends System.Object {
var position : Vector3;
var range : float;
}
function Start () {
target = gameObject.Find("Player").transform;
while(loopHandle) {
if(cameraNodes.length) {
var node : int = -1;
for( var i = 0; i < cameraNodes.length; ++i) { // Faster to use ++i than i++
if(cameraNodes[i].range >= Vector3.Distance(target.position, cameraNodes[i].position)) {
node = i;
break; // Bail out of your for-loop here since you found what you are looking for
}
}
if (node > -1)
transform.position = cameraNodes[node].position;
}
yield WaitForSeconds(1.0);
}
}
function Update () {
transform.LookAt(target);
}
Edit: They do not need to be declared public, just FYI. Put up the code based on what George said.
Thank you both on quick help. Now it works