Hi, hoping you’re doing well : ). I’m making a networking test game. I have already done the controller for the players. Until now, I have added a ball, which is suppose to be a mobile obstacle, this ball has a script that defines its movement. In order to move, the ball has a list of Transforms (empty GameObjects) and a method that lerps the ball towards each Transform.
The ball in the editor looks like :
Original Post on Discord
by user 632418299711324161
The ObsMovement
script looks like :
export class ObsMovement extends Behaviour{
@serializable()
speed : number = 3;
@serializable(Array<GameObject>)
moveTargets !: Array<GameObject>
protected currentDestination !:GameObject;
protected destinationPosition !: Vector3;
protected currentPosition !:Vector3;
protected arrive : boolean = false;
//protected movementVector : Vector3 = new Vector3(0,0,0);
protected canMove :boolean = false;
onEnable(): void {
//this.gameObject.getComponent(SyncedTransform)?.requestOwnership();
}
start(): void {
this.currentPosition = getWorldPosition(this.gameObject);
this.currentDestination = this.moveTargets[0];
this.destinationPosition = getWorldPosition(this.currentDestination);
console.log("Current destination (Game Object) ",this.currentDestination);
console.log("Destination Position (Vector 3) ",this.destinationPosition);
console.log("Current Position (Vector 3) ",this.currentPosition);
}
update(): void {
if(this.context.input.getKeyDown()=="x"){
console.log("POINTER DOWN")
this.canMove = true;
}
if(this.canMove){
this.moveTowards();
}
}
moveTowards(){
if(!this.arrive){
this.currentPosition.lerp(this.destinationPosition, this.context.time.deltaTime*this.speed);
setWorldPosition(this.gameObject,this.currentPosition);
if(this.currentPosition.distanceTo(this.destinationPosition)<1){
//this.arrive = true;
}
}else{
// Set a new destination
}
}
setDestination(newDestination : GameObject){
this.currentPosition = getWorldPosition(this.gameObject);
this.currentDestination = newDestination;
this.destinationPosition = getWorldPosition(newDestination,);
}
}
by user 632418299711324161
Okey, now, here comes the weird thing.
When I´m in solo it works fine. (When I click “x” it lerps)
by user 632418299711324161
by user 632418299711324161
But when I add a second player, this happens
by user 632418299711324161
by user 632418299711324161
What is happening ? Why is the red ball following the players ?
by user 632418299711324161
This should be the destination of the ball :
by user 632418299711324161
Both ball and the D1 (a transform) are children from the object Enemy
by user 632418299711324161
marcel
(marwi)
November 23, 2023, 12:00am
10
Hi, the serializable for your moveTargets is not correct (it should not contain Array but instead just the Type GameObject)
@serializable(GameObject)
moveTargets !: Array<GameObject>
the problem might be related to getWorldPosition
and the vector3 being re-used under the hood. Try creating a copy of it like so:
this.currentPosition = getWorldPosition(this.gameObject).clone();
this.destinationPosition = getWorldPosition(this.currentDestination).clone();
Ok, thaks marcel That works almost well. Just there is another issue, when I try to change the new destination (another GameObject from the array) it doesn´t work. I have two versions, one cloning the next GameObject and the other not :
by user 632418299711324161
This is the new script :
export class ObsMovement extends Behaviour{
@serializable()
speed : number = 5;
@serializable(GameObject)
moveTargets !: Array<GameObject>
protected currentDestination !:GameObject;
protected destinationIndex : number = 0;
protected destinationPosition !: Vector3;
protected currentPosition !:Vector3;
protected arrive : boolean = false;
//protected movementVector : Vector3 = new Vector3(0,0,0);
protected canMove :boolean = false;
onEnable(): void {
this.gameObject.getComponent(SyncedTransform)!.requestOwnership();
}
start(): void {
this.currentPosition = getWorldPosition(this.gameObject).clone();
this.currentDestination = this.moveTargets[this.destinationIndex];
this.destinationPosition = getWorldPosition(this.currentDestination).clone();
console.log("Current destination (Game Object) ",this.currentDestination);
console.log("Destination Position (Vector 3) ",this.destinationPosition);
console.log("Current Position (Vector 3) ",this.currentPosition);
}
update(): void {
if(this.context.input.getKeyDown()=="x"){
console.log("POINTER DOWN")
this.canMove = true;
}
if(this.canMove){
this.moveTowards();
}
}
by user 632418299711324161
setDestination(){
this.currentPosition = getWorldPosition(this.gameObject);
//this.currentDestination = newDestination.clone();
this.destinationPosition = getWorldPosition(this.currentDestination).clone();
}
getNextDestination(){
console.log("Current destination index", this.destinationIndex);
this.destinationIndex=(this.destinationIndex+1)%this.moveTargets.length;
console.log("New destination index",this.destinationIndex);
this.currentDestination = this.moveTargets[this.destinationIndex].clone();
}
}
by user 632418299711324161
Now, the problem is in the getNextDestination()
method just when I change the currentDestination
, It seems that there is an error when I use clone()
:
by user 632418299711324161
by user 632418299711324161
On the other hand, If I don´t use clone()
, the bahavior is the next :
by user 632418299711324161
by user 632418299711324161
Do you know whats happening? I know that is in the moment of re assing a new destination but I´m not sure why if is the same logic as the start()
method.
by user 632418299711324161