Multiple scripts (OOP) / Project Organization

:information_source: Attention Topic was automatically imported from the old Question2Answer platform.
:bust_in_silhouette: Asked By stephannGameDev

Hello folks,

I am a newcomer on Godot Engine (less than a week using Godot) and
and I’m learning how to better organize the project.

My game has a common behavior among objects that is follow another object and I don’t want repeat the same code for each different object. So I created a new scene with a generic Node called FollowBehavior and attached a script. The script look like this:

# FollowBehavior.gd
extends Node

var object
var target

func init(_object, _target):
	object = _object
	target = _target

func _ready():
	pass

func _process(delta):
	# MY LOGIC HERE

I added FollowBehavior as a child node in some objects and in their respective scripts I did this:

# Object with follow behavior
func _ready():
	$FollowBehavior.init(self, other_object)

Is there a better alternative for this? Is it the “best” way?

I’ve been struggling with the exact same problem. I’ve done it using this node method, but also this way:

extends Node

var a_behaviour

func _init():
	a_behaviour = my_behaviour.new()
	a_behaviour.init(self)

I found that this way avoids some null object errors that can happen because of the order in which the nodes get created and the engine trying to initialize variables on objects that aren’t created yet.

The downside is that you can’t use the editor modify exported properties of the behaviour.

NaughtyGnosiophile | 2018-07-28 10:22

:bust_in_silhouette: Reply From: volzhs

you can do it like below

# FollowBehavior.gd
extends Node

var target

func _ready():
    pass

func _process(delta):
    if target == null: return
    # YOUR LOGIC HERE

and using extends

# Object with follow behavior
extends "FollowBehavior.gd"

func _ready():
    target = other_object

for more information, read this section.

But I can’t have multiple extends (I got 'extends' already used for this class error).
And my objects will have multiples behaviors. Sorry for not making it clear.

stephannGameDev | 2018-07-25 15:01

in that case, probably, your way is best I think.

volzhs | 2018-07-25 15:04