Linked Character not showing up in game play

I am spawning a character, that has been linked in from another .blend file. I have noticed that the character appears in the editor, I can create animations (after proxying the armature), however, when the game is playing the character doesn’t appear. When I turn on the steering visualization, i can see the red lines going from the spawn point to the destination, and see that the collisions are happening. I thought there was an issue with the problem using the original linked in group since it was attached to an empty, so I even tried using the armature proxy object as the spawned object. No luck either way. It is almost like there is an empty following the line, but with mass!

I have seen/read most resources I could google about this issue, however, I am not sure I am googling for the correct terms.

How does one properly set up a character for usage as a linked object, followed by how does one properly utilize a linked object in a blend?

Resources, links, help appreciated!

Thanks!

I guess you have some sort of (subsurf etc) modifier on the skin mesh. This prevents the skin to appear in the game.

Thanks for the info. There is in fact a modifier on the original character. Is there a guide on how to set up characters for BGE? Seems like most of the characters I am using are not rendering properly in BGE.

Thanks!

As far as I know you need the armature modifier, but it must be the first or the last one in the modifier stack.

I usually have the armature modifier only as it is required.

Other modifiers might work depending on the situation. E.g. the mirror modifier works on normal skin objects, but not as part of a group instance. I do not think there is a list with what modifiers are supported and when.

I am seriously missing something. Do I have to proxy everything on a linked object, if it is a group? Seems like the wrong way and a lot of effort to bring characters into the game.

I have a simple robot character, with about 15 pieces held together with a simple rig. I grouped all of the objects I want to link into another blend, but do I still need to proxy every item to make it useful in my game?

Please tell me this is not the proper way to bring characters into to the game; I can’t imagine development teams having to perform all of this work to pull everything together.

Any sage advice?

I remember in the last BGMC Monster had an elaborate setup on how to load the character properly. I could swear he also said he should make a guide about it since it’s something so many people ask about. :smiley:

But in the meantime you could always take a look into his submission and try to reverse engineer it.

I can’t imagine that this is difficult to accomplish, since it seems the most logical way to develop a game, by separating out the roles and responsibilities into separate blends. But if the time trade off is massive set up in the master blend, then this is really like replicating work… at least in my opinion.

I agree.

It’s just the topic of how to properly link different types of assets like entire characters with logic and cameras, animated meshes, physics setups, static objects, particle effects etc hasn’t been covered so much and you’re limited to little strips of information you’re able to pick up from various posts and the rest is trial-and-error.

I’m facing the same thing with my main project soon. So far I’ve got everything in my first level .blend because linking just wouldn’t work. But I need to separate that eventually before the bubble bursts.

You can look at the WALL-E game (follow the library link in my signature). It uses these techniques.

To be honest, I remember at one PC some meshes were missing too for no obvious reason. The same file were fine on all other PC’s I tried.

And no, you do not need to proxy. I do not know if that even works.

Maybe you could post a simplified demo?

I’ll put up what I have thus far, and post a link as soon as I can; after looking at your Wall-E blend. Thanks!

Monster,
I have posted a test blend for the problem I am seeing: https://www.dropbox.com/s/qj600yldefo650b/TestForMonster.blend

Any help or insight is appreciated!

Anyone else who is interested in helping me out, feel free to download the blend as well.

Thanks,
Rob.

I had a look at the file. I think this is the linking file only. You should provide the linked file too. Otherwise the group instance consists of the instantiating empty only.

One remark: The instantiating empty will loose all connections to the group instance after the scene starts. If you move the empty the group objects will not follow - in difference to Blender. You can parent group members to the empty via Python.

I totally forgot that that file was separate: here it is: https://www.dropbox.com/s/s5xon0opbqvsj2l/mo_01_armature.blend

I was just playing with the file and noticed that the empty created when the object is linked in, is moving as expected, but your comment about once the scene starts it will not move the group objects along with it is exactly what I am seeing. You mention parenting the group members to the empty using python.

Can that be done at runtime? I’d love to peek at some existing code! :slight_smile:

Yes you can do that. Have a look at the KX_GameObject to see how to identify the according objects.

I suggest to let the group objects parent themselves to the empty because they know better who is the root of the group objects.

I used a similar technique with LinkLib. Just now it is not updated with this new attributes. It still works and delivers some ideas what you can do with groups.

Monster, after looking at the code docs you pointed to above, I was able to get the functionality using the code snippet below.

Still needs to be refined to accomplish what I need it to do, but the Linked Group is now following the Empty created by the linking process.

Would/should this be considered a bug? Or a request for a change to add the functionality to be able to control linked in objects? Seems like this should be basic functionality of the BGE. IMHO…

Thanks for your help and all others who contributed to my enlightenment.

This code is set up after linking in a Group from another .blend using the following Logic Bricks:

Always(True Pulse)->Python->Steering


'''
This is a test script for testing out ideas
'''
import bge,mathutils
    
class HookEmpty(object):
    def __init__(self,cont):
        self.cont = cont
        self.own = cont.owner
        self.mutate()
        
    def mutate(self):
        for child in self.own.groupMembers:
            child.setParent(self.own,False,False)
    def update(self):
        steering = self.cont.actuators["Steering"]
        self.cont.activate(steering)
 
def isCont(object):
	if str(object.__class__) == "<class 'SCA_PythonController'>":
		return True
	return False


def msg(*args):
	message = ""
	for i in args:
		message += str(i)
		
	if DEBUG_MESSAGES:
		print('[DEBUG] ' + message)
	
def main():
	cont = bge.logic.getCurrentController()
	own = cont.owner
	
	if 'my.hookEmpty' not in own:
		own['my.hookEmpty'] = HookEmpty(cont)
	else:
		own['my.hookEmpty'].update()
	
if bge.logic.getCurrentController().mode == 0:
	main()   

I do not think it is a bug. It is more a missing feature.

I already wrote this up in an proposal, that would allow much more powerful groups. But I do not think it will be implemented soon (or at all).

I would do the other way around. Let one group member parent itself to the one and only group object. The group knows which is the right object and the code is much simpler:


def parentToGroupObject():
   owner = getOwner()
   owner.setParent( owner.groupObject )

The other way around is similar as long as there is only one potential candidate for parenting:


def parentGroupObject():
   owner = getOwner()
   owner.groupObject.setParent(owner)