I can change the pupil's location by changing it's uv offset. I think I want to use this for the eyebrows too. ๐Ÿคจ
I keep forgetting I should draw eyebrows. Also now the player's facial expressions work the same as the npc's.

My next goal is to make a comic like cutscene. I am about a week away from working on this project for half a year. I really want to have video devlog by then, but I doubt I'll be able to make it. ๐Ÿ˜ฅ

4 days later


Testing out some comic style framing. 2 different methods, both with their pros and cons. It's a pain to set up. I have to think of a way to make it a bit more efficient to make. I will do some adjustments and then I will make a test cutscene. If the cutscene proves to be successful, I will move on to the next important aspect of the game, save files and quests. ๐Ÿ’พ

I am decently happy with the progress I have made the last few weeks. Soon the real game will be in development. It's time to really get creative with what I want this project to become. Although I still have to do loads of bugs fixes and other tweaks. ๐Ÿ˜…

I'll be totally honest, I haven't read a single thing you've said. I just looked at the pretty pictures. Yet I'd still be down to play whatever this turns into. Looks fun :-)

    a month later

    Damn, it's been a while since my last update.
    Loads of stuff on my mind and loads of laziness.
    I want to add a few NPC models, mainly so I can start with the story part.
    For now I will mainly focus on important characters.
    This model is not finished yet, I just need to do some adjustments and make the hair messier.
    She's got a nice moustache tho. ๐Ÿ‘จ


    Working on a rough layout for the town level. ๐Ÿ‡ณ๐Ÿ‡ฑ
    The models will be replaced of course.

    GodotBeginnerRich

    The character is based of an old character I created for a different project. In that project she was meant to be just an npc. I never got far in that project, because at the time I wasn't very used to coding and game design. I do want to restart that project at some point, now that I have more experience. As for the character, I wanted her to be weird and a bit delusional, so I gave her a moustache. Not only unconventional for a girl, but also in the story everyone wears the same "school uniform", wearing something outside the norm would add to her weirdness.

    Anyway, I want to go back at some off my older projects / ideas and implement them or reference them in this one. This girl is one of them, removing the moustache would remove the point.

    In a way, she is also a reference to mooncity, a 2d platformer I once worked on.

    I don't have proper textures made, these are just placeholders. ๐Ÿงฑ
    Also, fun fact: The lantern model was made by a friend of mine, meaning it's the only 3d model, so far, I didn't make.

    Right now I only have 3 different buildings, which is too much repetition. I will make at least 2 more, to make it more varied. At least it now gives a nice rough idea how these street will look like with different buildings.
    Also I hate it whenever I reimport models that all the textures disappear. Always having to reapply everything is just pure pain.
    I should really find a better way switching between godot and blender.

      SuperDoomKing Also I hate it whenever I reimport models that all the textures disappear. Always having to reapply everything is just pure pain.

      That's unusual. I've reimported my character many times but never have that problem. (I use the default gltf export settings in Blender, the only tick I make is to export only selected object)

        Gowydot

        On default gltf and other formats export with materials on.
        I export my models (usually) without materials. If I export models with materials on, this would not be an issue.
        However I like to make the materials and shaders in godot, so it's easier to reuse it for multiple models.
        If I exported everything with materials, I would have like 10 different materials with the same brick texture for different models.
        While not terrible, having only 1 brick material makes it easier to change the bricks for all models at once.

        So the materials aren't really part of the model.
        I set the materials under Surface Material Override.
        When I reimport the models, it also removes the materials from the Surface Material Override.
        A bit annoying, I hope they change it in a future version of Godot.

          Adding some objects, like trees and lanterns.
          It's starting to look like a real town. ๐Ÿ˜ƒ
          There are still some major flaws, like the fence floating in the air.
          For now it's just visual representation of what it may will look like.

          SuperDoomKing
          You can try setting it up using the code set_surface_override_material(). Place the code in _ready() script somewhere above your imported node and it will do it for you automatically upon loading.
          for example:

          @onready var bricks = preload("res://bricks.png")
          @onready var house_mesh = $House/house_Meshinstance3D #your imported house's mesh
          
          func _ready():
          	var mat = StandardMaterial3D.new()
          	mat.albedo_texture = bricks
          	house_mesh.set_surface_override_material(0,mat)

          Then you can apply this code on other house object (eg. house1_mesh = $House1/house_Meshinstance3D) and it will use the same bricks.png. Whatever material settings in the inspector can also be set via code. You can use this method for shader material as well.

          Try it on simple cube project first and see if it suitable for your need.

            Gowydot
            I had thought about such automation before.
            I never did it, since I thought the amount of time setting everything up would be a waste just for a mild inconvenience.
            Sometimes it's hard to decide if creating automation is worth the effort.
            I'll consider doing it, now I have to do a lot more level creation.

            Probably a stupid question:

            Gowydot Place the code in _ready() script somewhere above your imported node and it will do it for you automatically upon loading.

            This code is placed in the script in the game. Is it possible to perform a similar procedure when importing models, because there are import scripts?

            `

            @tool
            extends MeshInstance3D
            
            @onready var placeholder_mat = preload("res://material/normal.tres")
            @export var override : Array[StandardMaterial3D]
            
            
            func _ready():
            	
            	# For New Models
            	if override.size() < get_surface_override_material_count():
            		override.clear()
            		for i in range(get_surface_override_material_count()):
            			# Check If Material Exists
            			if get_surface_override_material(i):
            				override.append(get_surface_override_material(i))
            			else:
            				override.append(placeholder_mat)
            			
            	
            	# Check If Materials Match
            	else:
            		for i in range(get_surface_override_material_count()):
            			# Replaces Materials With Array Materials
            			if override[i] != get_surface_override_material(i):
            				set_surface_override_material(i, override[i])

            `

            Gowydot
            I came up with this. A bit overly complicated maybe, but can be applied to every model, regardless of materials and amount.

              SuperDoomKing
              `

              @tool
              extends MeshInstance3D
              
              @onready var placeholder_mat = preload("res://material/normal.tres")
              @export var override : Array[StandardMaterial3D]
              
              
              func _ready():
              	var surface_count = get_surface_override_material_count()
              	var override_size = override.size()
              	
              	# Check If Materials Match
              	for i in range(surface_count):
              		# Replaces Materials With Array Materials
              		if i < override_size:
              			if override[i] != get_surface_override_material(i):
              				set_surface_override_material(i, override[i])
              		else:
              			break
              	
              	
              	# For New Models
              	if override_size < surface_count:
              		override.clear()
              		for i in range(surface_count):
              			# Check If Material Exists
              			if get_surface_override_material(i):
              				override.append(get_surface_override_material(i))
              			else:
              				override.append(placeholder_mat)

              `

              I realized my previous version was very flawed, so I made a small update.