Det var länge sedan jag lade upp en post om vad vi arbetar med och vad vi lagt tid på.
Tänkte jag kunde gå in på det tekniska lite
Character System
Ni som följer spelets utveckling har säkert inte missat att vi gjort om karaktärsystemet.
Vi ville ha fler möjligheter, och det har vi absolut nu.
Jag designade ett nytt system som hanterar "skinned meshes", kroppsdelar / tillbehör på karaktärerna.
Skinned Meshes är modeller som är riggade mot ett skelett och animeras mot det. Vill man ha utseenden med olika rustningar och sånt så är detta ett krav så att allting ansluts och animeras med samma skelett.
För att få detta att fungera så fick jag först skapa ett skript som delade upp alla kroppsdelar i egna prefabs i Unity. Den lade också på ett script kallat "BodyPart" på varje prefab. Där sparar jag informationen om varje del, t.ex Kategori, Namn, Kön osv. som jag sedan använder för att sortera upp delarna och få en struktur.
Men det som också måste sparas i BodyPart är vilka ben (bones) som den måste ansluta till när den slängs på en redan existerande karaktär. Detta var lite meckigt, och jag fick lägga en hel del tid på att få det att fungera som det skulle, då ordningen i listan är extremt viktig att den blir i samma ordning som skelettets uppbyggnad.
Varje del lagrar iaf vilket ben som den huvudsakligen sitter fast i, sedan också referenser till de ben som den kräver att riggen har.
När den ansluts till en karaktär kan systemet då använda denna information för att få delen på rätt plats samt anslutas till det existerande skelettet.
Supressed Slots
En annan funktion jag lade in var att man direkt i BodyPart-inställningarna kunde lägga in "Supressed Slots", vilket innebär att en bodypart eller attachment kan dölja andra bodyparts.
Ett exempel är hjälmen på karaktären, som döljer huvudet samt allt hår och face-attachments. Så då sköts detta automatiskt så fort en kroppsdel med Supressed Slots läggs på en karaktär. Annars skulle hår, facial-hair, öron etc synts genom hjälmen på sina ställen.
Colors
En annan viktig funktion som vi ville ha var förmågan att ändra färg på respektive kroppsdel. Detta gjorde jag också ett system för. Det blev lite lättare då paketet vi investerat i med karaktärerna redan hade en Shader som kunde hantera olika färger på olika delar av varje kroppsdel / attachment.
Jag fick bara designa kontrollerna som skulle sköta detta. Det som tog mest tid var ju nätverksbitarna. Då servern måste spara informationen i databasen, och servern inte har några direkta referenser till de olika kroppsdelarna som finns (då de finns som prefabs i Unity) så fick jag göra diverse klasser för att hantera detta. I slutändan blev det bra, även om det är en del data som skickas till klienterna så är det inom en rimlig gräns.
Systemet bygger på 2 olika typer av Färger. Shared Colors samt Individual Colors.
När man skapar en karaktär, kan man spara Shared Colors på hela karaktären. Då ändras färgen på alla delar som finns på karaktären och som matchar typen till den färgen. Lite svårt att förklara i text, men en färgtyp är "Skin". Om jag lägger på en Shared Color med typen Skin så ändras "Skin Color" på alla delarna som karaktären har på sig.
På bilden så ser ni mitt "Costume Scene Script" som vi använder för att generera utseenden till NPCs.
Jag lade där in en Shared Color med typen Skin, och en röd färg så det syns tydligt.
Där ser ni att den då ändrar alla kroppsdelars hudfärg till samma, så det blir enhetligt över hela karaktären.
Lade också på en Shared Color (Hair) med en orange färg, som ändrar håret på alla kroppsdelar.
Finns lite fler color types man kan ändra
Sen kan man gå in på Indivuell nivå, och ändra färgen på varje kroppsdel individuellt om man vill det.
Så på bilden nedan lade jag in en Color(Skin) på Head där jag överskrider den delade skin färgen och sätter den på grön istället.
Trigger System Updates
Jag har gjort en stor förändring i mitt ActionTrigger system. Som jag förklarat tidigare använder vi detta systemet till allting.
Där bestämmer vi vad som ska hända när man t.ex använder ett item, kastar en magi, pratar med en NPC etc.
Jag har implementerat stödet för variabler, samt returnerade värden i systemet.
Så att alla Actions och Conditions kan nu ta emot och returnera värden baserat på vad dom gör.
Detta ger oss obegränsade möjligheter med systemet, och tillåter oss att skapa nästan vad som helst.
Ett exempel vi kan använda är om jag vill att ett vapen ska ha någon form av Lifesteal.
Säg att jag skapar ett svärd som jag vill skall stjäla liv från den jag slår på, baserat på hur mycket skada jag gör.
Börjar med att jag skapar ett nytt Item i Entity Editor, Ger den en modell (Valde Svärdmodellen) och gav den ett namn, Lifestealer!
Jag måste såklart också lägga på en WeaponModifier på svärdet, så att systemet vet att det är ett vapen.
På WeaponModifier lägger jag också in en Trigger, en OnAttackHit som triggar så fort vapnet träffar något.
Går jag sedan in på OnAttackHit triggern, så ser jag att den är helt tom. Så om jag träffar någon med mitt vapen i nuläget så händer ingenting speciellt.
Jag ger min trigger ett namn (Lifesteal) för att hålla allt organiserat, samt lägger på en HealEntity action.
Nu kommer vi till det som är uppdaterat. Förr kunde jag bara använda inskrivna värden. Som ni ser så healar jag min Entity för 5hp i nuläget, men då jag egentligen inte vet exakt hur mycket jag vill heala honom för så måste jag använda mig av variables.
Jag vet att triggern OnAttackHit returnerar lite värden, och ett av de värdena är DamageGiven.
Jag hämtar den variabeln (DamageGiven), och ger den ett annat namn, som beskriver ändamålet för variabeln (igen, endast för organiseringen), "Lifesteal Amount".
Jag kan sedan skapa olika instanser av variabeln, och ansluta den till vilket fält jag vill i någon av mina Actions. Just nu har jag bara 1 Action, "HealEntity". Jag vill ju ansluta variabeln till min HealAmount på HealEntity. Då får jag skapa en ny instans från min "Lifesteal Amount", av typen int.
Efter jag gjort det kan jag ansluta den till vilket fält som helst av typen int.
Jag väljer då min Action, HealEntity, samt fältet Heal/HealAmount.
Jag passar också på att skriva in en liten expression, så att vi inte healar fullt av skadan vi gör, utan bara 25% genom att muliplicera det returnerade värdet med 0.25.
Jag sparar mitt nya vapen, och hoppar in i spelet för att testa det!
Och eftersom editorerna är direktanslutna till servern, så behövs inga omstarter eller någonting utan svärdet finns där redan, bara att spawna ett och köra!
Blev nästan som en tutorial det där xD Men då fick ni se lite hur vi jobbar med ActionTrigger systemet också
Kommer mer mer info, men får nog dela upp det i två inlägg så gör det efter gymmet