Showing posts with label system design. Show all posts
Showing posts with label system design. Show all posts

Tuesday, March 12, 2019

NPC Quest Giver Tutorial

This tutorial will cover creating an NPC Quest Giver using Unity, C#, and Mixamo. We will have an NPC that wanders along a path and can be interrupted by the player approach.

NPC Quest Giver
This tutorial will build off the core functionality from the Patrolling Enemy tutorial.
Modify the Spotted Functionality
  1. When the NPC spots the player, she should stand still instead of following the player
  2. Instead of an attack animation, we will import a friendly “talking” animation from Mixamo
  3. Import the new animation, and add it to the Animator Controller for the character
  4. Remove the Attack animation and Trigger, setup the Talking animation as before, with a Trigger called “Talk” to transition to the Talking animation
  5. Change the Animation trigger in the script
  6. We also want to stop the character from returning to her patrol, so we will add a bool at the top called “talking”
  7. And check for that bool  in our distance check in Update
  8. We’ll also add OnTriggerExit to set the character back to her patrol
  9. It would also help if she looks at us while she’s talking
  10. Lastly, add popup text for the NPC’s dialogue using GameObject > UI > Text
  11. Decide what your Quest Prompt should say, and remember to bind the text object’s Rect Transform to the bottom of the screen
  12. Disable the text object by default, we will toggle it on from the script
  13. Add using UnityEngine.UI to the top of the script and make a public GameObject for the quest text
  14. Set the QuestText true and false in the appropriate places
  15. Drag the QuestText to the empty GameObject slot on your character
  16. Be sure to test!
Quest Items and Activating the Quest
  1. Create a new C# script for the Quest Item (QuestItem.cs)
  2. Find a model to use as the Quest Item and give it a BoxCollider marked as IsTrigger, be sure the collider goes around the entire object
  3. Attach the QuestItem script to the object
  4. In the QuestItem script, add the OnTriggerEnter function
  5. Create a public bool to keep track if the player has collected the item
  6. If the colliding object is the player, set that tracking bool to true
  7. Back in the character’s script, we need a bool to keep track if the quest item was found
  8. And we need a public QuestItem to link to the quest item object in the scene
  9. In the character’s Update function, check to see if the quest item was collected
  10. If it was collected, we want to destroy it
  11. And we only want to run this check until it has been found, otherwise this check will throw an error after the object is destroyed
  12. Be sure to link the Quest Item to the public slot on the character’s script
  13. At this point if you test, the Quest Item should disappear when you collide with it
  14. We should also add a public bool in the character’s script to activate the quest after the player talks to her
  15. Activate the quest when the player talks to her
  16. In the QuestItem script, we need a public reference to the character’s script (in this case I left it called Enemy.cs from the previous tutorial, even though it is now used as an NPC)
  17. Before collecting the item, check if the questGiver’s quest is active
  18. Remember to link the character to the QuestGiver slot in the scene
  19. Now the cat can only be collected after the quest has been activated by talking to the granny
Completing the Quest
  1. We need to add a new section to the talking portion of the character’s script to change the text if the Quest Item was found
  2. Now to reward the player for completing the quest. Create a new Text object to show the reward, in this case I’m going to give the player XP
  3. We want this text to be large, bright, and eye-catching
  4. Let’s create an Animation to make the text popup more exciting
  5. Attache the new animation to the Text Object
  6. Open the Animation window
  7. Make sure you have the text selected, then Add Property for the Text.Color and Anchored Position
  8. Give it an Alpha of 0 for the start and end keyframe, and Alpha of 1 for a keyframe in the middle, so it fades in and out
  9. Set the Y value higher in the last keyframe so the test floats upward
  10. Now we need to trigger the animation. In the Animator window, create an Empty State
  11. Set that as the Layer Default State
  12. Make a transition to and from the Popup animation
  13. Make a new Trigger in the Parameters tab and use that as the Condition to transition to the Popup animation
  14. Remember to uncheck the box for Has Exit Time
  15. Back in the character’s script, add a new public Animator to reference the popup text in the scene
  16. In the quest completion part of the script, trigger the animation
  17. Remember to drag the text into the public slot you created
  18. Set the starting Alpha for the text to 0 so it is not visible from the beginning
Summary
You should now have a quest giver that requests a specific item, the ability to go and collect that item, and a reward when you return to the quest giver. This can easily be expanded for a quest giver to ask for a certain number of things like “collect 50 gems” or “kill 10 enemies”

Sunday, August 5, 2018

Prototyping Game Systems, Part 2: Building a Prototype Play Space

This is Part 2 of a 5 part series on my latest course on Pluralsight: Prototyping Game Systems. If you missed Part 1 be sure to start there!

In part 1 we covered the design-prototype relationship, how to assess design needs, and we discussed game mechanics and systems. Next we need a playable space to prototype in. When prototyping in an existing game, it's generally best to make a "safe" scene for prototyping the new mechanics, to avoid causing issues that might break the main playable scene. This is especially important if multiple developers are working on the project simultaneously.

In this course we are using Unity to develop the game, and Unity has an excellent built-in prototyping tool called Pro Builder.


Pro Builder allows you to create and manipulate 3D shapes in the Unity editor, without needing an external 3D modeling tool.


With the help of Pro Builder, you can easily shape out a playable space in just a matter of minutes. The manipulator tool allows you to adjust faces, edges, and vertices.


You can also extrude and bevel to make interesting shapes and crevices.


And when you are satisfied with your shape, you can apply textures, either to the entire shape or to individual faces. Pro Builder even has a simple UV editor to give you more precision for the texture.

For this course I've created a large open space with stairs and an arch, so the walkable ground has various heights and there is an area to walk under where the character won't be visible.


Next we drop in our character model and add a nav mesh. This game is in 3rd person, and the character controller has already been built for us and uses the nav mesh to move around.



The way the nav mesh works is it collects information about any surfaces that are marked "Static" and generates a "walkable" area, shown with a blue overlay. This nav mesh tells the character where it can walk via a Nav Mesh Agent component, which is attached to the character controller.


Now we have a playable space set up for our character to run around that doesn't interfere with the main scenes of the game, so we are all ready to start prototyping the new mechanics.


In part 3 we will build new mechanics for the game, including digging, looting, and powerups. Thanks for reading, and if you enjoyed this please check out the full course on Pluralsight: Prototyping Game Systems for Swords and Shovels.