Search Unity

  1. Megacity Metro Demo now available. Download now.
    Dismiss Notice
  2. Unity support for visionOS is now available. Learn more in our blog post.
    Dismiss Notice

3D [Infinity Series] Works-In-Progress Mega Thread

Discussion in 'Art Assets In Progress' started by infinitypbr, Jun 2, 2016.

  1. infinitypbr

    infinitypbr

    Joined:
    Nov 28, 2012
    Posts:
    3,149
    Hey all! For anyone who doesn't' get the email updates, I've stared a GitHub page!

    https://www.infinitypbr.com/git.php

    There is one project right now, that I'm hoping people will be interested in collaborating on, to get humanoids (any, not just my own) to rider mount-able characters like Dragons (Again ,not just my own). After failing to figure it out myself, and paying someone to figure it out who ended up not figuring it out while also taking my money, I decided it's best to ask you guys for help.

    If you have the Dragon & Human, or any humanoid & mount-able character, and are interested in contributing, check it out. Thanks!!
     
  2. JBR-games

    JBR-games

    Joined:
    Sep 26, 2012
    Posts:
    708
    Whats the plan to do this, use an ik solution ?
     
    infinitypbr likes this.
  3. infinitypbr

    infinitypbr

    Joined:
    Nov 28, 2012
    Posts:
    3,149
    I think there's two things that are required. IK will keep the feet in the stirrups and the hand on the reins (if applicable... the solution would have to allow for more options, since there could be some Mounts that don't have a saddle, and so no reins or stirrups).

    Then "Animator.MatchTarget" should be the way to go for the animation -- in theory it's supposed to make the Rider end up at the right position regardless of the start position, basically moving them through the animation ever so slightly to get in the right spot.
     
  4. infinitypbr

    infinitypbr

    Joined:
    Nov 28, 2012
    Posts:
    3,149
    Here's another new Repository -- this one should be of interest to almost everyone :)

    https://github.com/infinitypbr/AudioClipArrayCombiner

    I hired someone to make a "Audio clip Combiner" script. It works -- any number of layers can be combined into a single .wav file with options for volume and delay. Problem is, it was supposed to be an array of clips per layer, rather than a single clip. And the developer has stopped replying for the past 3 weeks.

    I fixed a big bug, and started working on getting the array part figured out, but I'm stuck. I realized this is a great opportunity for my new push to make open source scripts. The end result will be included in all of the packs plus provided for free on the Asset Store. (If I did it all myself, it'd be included in the packs, but would probably cost $9 in the asset store...I don't feel like I can ethically charge for it if others help me make it better, though).

    Problem
    It should be simple enough to export all the combinations, once I know the combinations. But as of now, I can't figure out how to get an array of all the combinations. I figure that I'll make a string[] array that has a comma delimitated list of all the combos.

    Example, for 3 layers with 2 clips each...
    0,0,0
    1,0,0
    0,1,0
    1,1,0
    0,0,1
    1,0,1
    0,1,1
    1,1,1

    Then, once I have that list, the "SaveClip" function (which needs to be modified, but should be simple to do), would Explode each String in the array and save the new clip using that new exploded array.

    But I don't know how to get an array of all the clips. I know how many layers I have, and I know how many clips there are per layer, but i'm not sure how to loop through to get all of the combinations.

    So...anyone have any ideas??
     
  5. Sovogal

    Sovogal

    Joined:
    Oct 15, 2016
    Posts:
    100
    Once you have a list of all clips, this will get the possible combinations:

    Code (CSharp):
    1.         static List<string> GetCombinations(List<object> list)
    2.         {
    3.             List<string> result = new List<string>();
    4.             double count = Math.Pow(2, list.Count);
    5.             for (int i = 1; i <= count - 1; i++)
    6.             {
    7.                 StringBuilder sb = new StringBuilder();
    8.                 string bitRepresentation = Convert.ToString(i, 2).PadLeft(list.Count, '0');
    9.                 for (int j = 0; j < bitRepresentation.Length; j++)
    10.                 {
    11.                     if (bitRepresentation[j] == '1')
    12.                     {
    13.                         sb.Append(list[j] + ", ");
    14.                     }
    15.                     //Add an else here to include nulls or what-have-you
    16.                 }
    17.  
    18.                 sb.Length -= 2;
    19.                 result.Add(sb.ToString());
    20.             }
    21.             return result;
    22.         }
    23.  
     
    Last edited: Jan 31, 2017
  6. Thoronnim_Crystalia

    Thoronnim_Crystalia

    Joined:
    Jan 24, 2017
    Posts:
    29
    Hi all!

    I'm trying to give you an answer about it, but I'm not sure to have got properly your point... I hope so!

    I changed the working and perfect function of Sovogal, just to generalize the procedure for any number of clip for layer... obviously hoping that this is the case...

    Code (CSharp):
    1.    
    2. private static List<string> GetCombinations(List<string> clipList, int layersCount)
    3.     {
    4.         List<string> result = new List<string>();
    5.         double combinationsCount = System.Math.Pow(clipList.Count, layersCount);
    6.  
    7.         for (int combinationIndex = 0; combinationIndex <= combinationsCount - 1; combinationIndex++)
    8.         {
    9.             System.Text.StringBuilder sb = new System.Text.StringBuilder();
    10.             string customBaseRepresentation = DecimalToArbitraryBase(combinationIndex, clipList.Count).PadLeft(layersCount, '0');
    11.  
    12.             for (int j = 0; j < customBaseRepresentation.Length; j++)
    13.             {
    14.                 int currentClipIndex = (int)Char.GetNumericValue(customBaseRepresentation[j]);
    15.                 sb.Append(clipList[currentClipIndex] + ", ");
    16.             }
    17.  
    18.             sb.Length -= 2;
    19.             result.Add(sb.ToString());
    20.         }
    21.         return result;
    22.     }
    23.  
    24.     private static string DecimalToArbitraryBase(long decimalNumber, int radix)
    25.     {
    26.         const int bitsInLong = 64;
    27.         const string digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    28.  
    29.         if (radix < 2 || radix > digits.Length)
    30.             throw new ArgumentException("The radix must be >= 2 and <= " + digits.Length.ToString());
    31.  
    32.         if (decimalNumber == 0)
    33.             return "0";
    34.  
    35.         int index = bitsInLong - 1;
    36.         long currentNumber = Math.Abs(decimalNumber);
    37.         char[] charArray = new char[bitsInLong];
    38.  
    39.         while (currentNumber != 0)
    40.         {
    41.             int remainder = (int)(currentNumber % radix);
    42.             charArray[index--] = digits[remainder];
    43.             currentNumber = currentNumber / radix;
    44.         }
    45.  
    46.         string result = new String(charArray, index + 1, bitsInLong - index - 1);
    47.         if (decimalNumber < 0)
    48.         {
    49.             result = "-" + result;
    50.         }
    51.  
    52.         return result;
    53.     }
    54.  
    55.     private static void printResult(List<string> combinationsList, int layersCount, int clipsCount)
    56.     {
    57.         string message = "Combinations of " + layersCount + " layers with " + clipsCount + " clips each:\n";
    58.  
    59.         foreach (string currCombination in combinationsList)
    60.             message += currCombination + "\n";
    61.  
    62.         Debug.Log(message);
    63.     }
    64.  
    With this script, if you call GetCombinations for 3 layers with 2 clips (like your example):

    Code (CSharp):
    1.         int layersCount = 3;
    2.         List<string> clipList = new List<string>();
    3.         clipList.Add("Clip 1");
    4.         clipList.Add("Clip 2");
    5.  
    6.         List<string> allCombinations = GetCombinations(clipList, layersCount);
    7.  
    8.         printResult(allCombinations, layersCount, clipList.Count);
    9.  
    you obtain

    Combinations of 3 layers with 2 clips each:
    Clip 1, Clip 1, Clip 1
    Clip 1, Clip 1, Clip 2
    Clip 1, Clip 2, Clip 1
    Clip 1, Clip 2, Clip 2
    Clip 2, Clip 1, Clip 1
    Clip 2, Clip 1, Clip 2
    Clip 2, Clip 2, Clip 1
    Clip 2, Clip 2, Clip 2

    Instead, if you have 3 clips and 2 layers, this is the result:

    Combinations of 2 layers with 3 clips each:
    Clip 1, Clip 1
    Clip 1, Clip 2
    Clip 1, Clip 3
    Clip 2, Clip 1
    Clip 2, Clip 2
    Clip 2, Clip 3
    Clip 3, Clip 1
    Clip 3, Clip 2
    Clip 3, Clip 3

    Let me know if this can help... or if we have to change something!
     
    JBR-games and Sovogal like this.
  7. tchris

    tchris

    Joined:
    Oct 10, 2012
    Posts:
    133
    I only glanced at the code so far but I think you'd want to use this (https://docs.unity3d.com/ScriptReference/Animator.SetIKPosition.html) to set the hands and feet to wherever they are needed on the mount. The script could have variables for the reins and stirrups and this could put the hands and feet in the right place once the animation brings them close enough.

    I could be wrong. I haven't done a lot of IK stuff.
     
    Xepherys and JBR-games like this.
  8. infinitypbr

    infinitypbr

    Joined:
    Nov 28, 2012
    Posts:
    3,149
    I've got something that works. Not sure if it's the best way, but it's not too many lines of code....

    Code (CSharp):
    1. void SaveNow()
    2.     {
    3.         // Find total number of exports
    4.         int totalExports    = 1;                                                // Start at 1...
    5.         for(int n = 0; n < audioLayers.Length; n++)
    6.         {
    7.             totalExports     *= audioLayers [n].clip.Length;                        // Multiply by the number of clips in each layer
    8.         }
    9.  
    10.         string[] combinations;                                                    // Start an array of all combinations
    11.         combinations = new string[totalExports];                                // Set the number of entries to the number of exports
    12.  
    13.         // Reset the onClip value for each layer
    14.         for (int r = 0; r < audioLayers.Length; r++) {
    15.             audioLayers[r].onClip = 0;
    16.         }
    17.          
    18.         for (int l = 0; l < audioLayers.Length; l++) {                            // For each layer...
    19.             int exportsLeft = 1;                                                    // Start at 1...
    20.             for(int i = l; i < audioLayers.Length; i++)                            // For each layer left in the list (don't compute those we've already done)
    21.             {
    22.                 exportsLeft     *= audioLayers [i].clip.Length;                    // Find out how many exports are left if it were just those layers
    23.             }
    24.  
    25.             int entriesPerValue = exportsLeft / audioLayers [l].clip.Length;    // Compute how many entires per value, if the total entries were exportsLeft
    26.             int entryCount = 0;                                                    // Set entryCount to 0
    27.  
    28.             for (int e = 0; e < combinations.Length; e++) {                        // For all combinations
    29.                 if (l != 0)                                                        // If this isn't the first layer
    30.                     combinations [e] = combinations [e] + ",";                    // Append a "," to the String
    31.                 combinations [e] = combinations [e] + audioLayers [l].onClip;    // Append the "onClip" value to the string
    32.                 entryCount++;                                                    // increase entryCount
    33.                 if (entryCount >= entriesPerValue) {                            // if we've done all the entires for that "onClip" value...
    34.                     audioLayers [l].onClip++;                                    // increase onClip by 1
    35.                     entryCount = 0;                                                // Reset entryCount
    36.                     if (audioLayers [l].onClip >= audioLayers [l].clip.Length)    // if we've also run out of clips for this layer
    37.                         audioLayers [l].onClip = 0;                                // Reset onClip count
    38.                 }
    39.             }
    40.         }
    41.  
    42.         // For each combination, save a .wav file with those clip numbers.
    43.         foreach(var combination in combinations)
    44.         {
    45.             // TO DO:
    46.             // * Explode the string into an array of clip numbers
    47.             // * Call the actual save code using those clips
    48.             Debug.Log (combination);
    49.         }
    50.     }
    I wasn't really sure how you guys were doing it -- I wasn't able to figure out your code. Being not the best coder, I don't always think as abstractly as I should, probably. So this is somewhat straight forward code, but it does the job.

    Let me know if you think there's ways to improve it!

    Andrew
     
  9. infinitypbr

    infinitypbr

    Joined:
    Nov 28, 2012
    Posts:
    3,149
    Ah man. I'm sure we've all done this. I just spent 90 minutes trying to figure out why all the exported clips had no sound. Lots of poking and comparing and then finally I realized I just had the "volume" variables all set to 0....

    So I've updated the GitHub page and the script now works. I'll be included in the packs soon enough, but you can grab it there. It'll likely come in handy as a good tool to have.

    I'm going to make an editor script so it can have a nice "Export Now" button and a warning about the volume (since it defaults to 0), maybe a button to set all volume to 1. And also I think a status bar, since 24 clips took a couple seconds, and the Medieval Battle Sounds pack is set to have 125 clips per "sound", and could have more if you'd like.
     
  10. infinitypbr

    infinitypbr

    Joined:
    Nov 28, 2012
    Posts:
    3,149
    Anyone know how to get rid of this warning?

    Screen Shot 2017-02-02 at 11.35.47 PM.png

    Code in question:

    Code (JavaScript):
    1.  function OnInspectorGUI()
    2.     {
    3.         var myScript : SFB_AudioClipArrayCombiner = target;            // A reference to the script
     
  11. infinitypbr

    infinitypbr

    Joined:
    Nov 28, 2012
    Posts:
    3,149
    Here's a video showing the Audio Clip Combiner in action. It's available free on the GitHub page, will be included as a download for all of my packs (or in the pack itself), and it'll be available on the asset store for $5 just to see what happens. But if you're reading this...then you should be able to get it for free :)

     
  12. Sovogal

    Sovogal

    Joined:
    Oct 15, 2016
    Posts:
    100
    Going to have to use #pragma downcast to get rid of the warnings. Unfortunately, I don't know much about Mono's implementation of javascript, but from what I gather, using javascript as a typed language frequently produces that warning. The compiler is reporting that you're implicitly downcasting your variable "myScript" of type SFB_AudioClipArrayCombiner to a generic unity object when you assign it to "target."

    Edit: You can try this:
    Code (JavaScript):
    1. var myScript : SFB_AudioClipArrayCombiner = target as SFB_AudioClipArrayCombiner;
    And a side note, you may want to try your hand at c#. Once you get used to the syntax, it's the same workflow as javascript, and you'll get yelled at quite obviously if you tried to do this in c#.
     
    infinitypbr and Xepherys like this.
  13. Xepherys

    Xepherys

    Joined:
    Sep 9, 2012
    Posts:
    204
    Without using TypeScript there isn't a "pretty" way to do it, but the above should suffice. I second C# - it's worth learning as you go.
     
    infinitypbr likes this.
  14. infinitypbr

    infinitypbr

    Joined:
    Nov 28, 2012
    Posts:
    3,149
    Thanks that did the trick! Now to update all the packs.... I really hope one day the Asset Store has a sort of multiple download option, so I don't have to upload 20GB+ of data just to update one line of code.

    I'm slowly learning the C#. The meat of that script is in C#, so that's something, and a bunch of it is stuff I added or modified. Slowly but maybe surely :D
     
  15. infinitypbr

    infinitypbr

    Joined:
    Nov 28, 2012
    Posts:
    3,149
    Wow I am one forgetful guy. Somehow I set up the Imp, made all the pretty sample photos, made the demo scene, uploaded it and released it to the world all while forgetting that he already has Mesh Morphing!

    I just went to start working on his mesh morphing when I got the feeling that maybe I had already seen it...and sure enough. Over the holidays there were delays, and I'm guessing during that time I fixated on the animation so much that I forgot entirely that the blend shapes had already been completed!

    So today I'll update the package with the "official" blend shapes...although it's already there, and has been there this whole time!

     
    Last edited: Feb 7, 2017
  16. infinitypbr

    infinitypbr

    Joined:
    Nov 28, 2012
    Posts:
    3,149
  17. Xepherys

    Xepherys

    Joined:
    Sep 9, 2012
    Posts:
    204
    @sfbaystudios - question about the animations that come with your packages (specifically the human model).

    First, I can't quite figure out how the `cast1` trigger is linked to Cast01_start. But I'd really like to understand it.

    Second, and maybe because they are baked in to the model somehow, I can't seem to find a way to capture when the animation rolls from one clip to the next. I have Cast01_start roll to Cast01_middle roll to Cast01_end. I want to capture the point at which start rolls to middle (or at least once middle starts to play), but I can't seem to capture the clip details. Thoughts?
     
    infinitypbr likes this.
  18. infinitypbr

    infinitypbr

    Joined:
    Nov 28, 2012
    Posts:
    3,149
    Screen Shot 2017-02-06 at 7.04.45 PM.png

    Cast1 triggers "Cast01_start", which automatically transitions from "Any State" to "Cast01_middle". The middle animation is on a loop, so it doesn't have an end transition.

    When you trigger "cast1End" by letting go of the button, it calls Any State -> Cast01_end

    For the second question, what do you mean by "capture when the animations rolls" -- specifically "Capture" and "rolls" are what I'm not understanding.
     
  19. Xepherys

    Xepherys

    Joined:
    Sep 9, 2012
    Posts:
    204
    Yeah, I changed it so that middle doesn't loop and just calls end - suits my needs better.

    As for the other part, I'm using this animation to cast a shield spell (basically a bubble). I don't want the shield itself to spawn (or be enabled) until the player's hand is fully extended (basically, the beginning of the _middle portion).

    So I want to do something like:

    while (anim.isPlayingClip("Cast01_middle")
    {
    yield return null;
    }

    Yes, I know .isPlayingClip isn't a real thing, though I sure wish it was!
     
  20. Sovogal

    Sovogal

    Joined:
    Oct 15, 2016
    Posts:
    100
    I too wish states notified on a change. Unfortunately you're stuck comparing previous state to current state.

    Code (CSharp):
    1. private Animator _animator;
    2. private AnimatorStateInfo _lastState = null;
    3. void Start()
    4. {
    5.      var animator = this.GetComponent<Animator>();
    6. }
    7. void Update()
    8. {
    9.      var currentStateInfo = this.Animator.GetCurrentAnimatorStateInfo(0);
    10.      if (currentStateInfo != _lastStateInfo)
    11.      {
    12.            _lastStateInfo = currentStateInfo;
    13.           //Do something to react to the state change
    14.      }
    15. }
     
  21. Sovogal

    Sovogal

    Joined:
    Oct 15, 2016
    Posts:
    100
    Sounds like a job for Animation Events. You can add an event in the animation's import settings at the point during the animation when the avatar hands are fully extended. This event must reference a corresponding function on a component in the same hierarchy as the animation controller.
     
    Acissathar, infinitypbr and Xepherys like this.
  22. Xepherys

    Xepherys

    Joined:
    Sep 9, 2012
    Posts:
    204
    That's a problem because the script that needs the info isn't a component, nor does it inherit from MonoBehaviour.
     
  23. infinitypbr

    infinitypbr

    Joined:
    Nov 28, 2012
    Posts:
    3,149
    I was also going to suggest Animation Events.

    However -- you can add scripts to the mecanim as well I think? I've never used it because it's C# only (And as we speak I'm working through errors trying to figure out how to make C# work!), but perhaps that would be the way to go?
     
  24. Sovogal

    Sovogal

    Joined:
    Oct 15, 2016
    Posts:
    100
    I have entities (extends MonoBehaviour) and entity abilities (standalone class). The entity has a list of abilities and is in the same hierarchy as the animator controller. I listen to events from the entity and call the corresponding method in the ability. There are a ton of ways to construct this, and that example is just one.

    Another way I would entertain if I needed it would be an AnimationEventBroadcaster that could be subscribed to from any class.
     
    Xepherys likes this.
  25. infinitypbr

    infinitypbr

    Joined:
    Nov 28, 2012
    Posts:
    3,149
  26. tchris

    tchris

    Joined:
    Oct 10, 2012
    Posts:
    133
    Definitely still try to use Animation Events. Maybe you can have a script that does inherit from Monobehavior and then talks to your other script when the event is raised?
     
  27. infinitypbr

    infinitypbr

    Joined:
    Nov 28, 2012
    Posts:
    3,149
    What I'm still working on...

    Sometimes I start things and then everything falls apart. So here's an update...

    Elves
    I started working with a modeler, but it became clear that there was some kind of issue -- communication or expectations of quality or something, and I've let him go. I feel bad, and I was really hopeful that it would work out, but unfortunately it didn't. I may be re-connecting with a previous modeler who did good work but wasn't available to keep going a year ago. We shall see.

    Half Orcs
    Related, the main modeler for most of my characters will be doing the wardrobe. He also did the human wardrobe. He's slower at wardrobe (and is paid a day rate, so it's more expensive), but since the Elf isn't working at the moment, I want to make sure something is happening on the humanoid front.

    Dwarves
    Also related, the modeler will do Dwarves after the Half-Orc clothing. Unless the elves still need clothes, then I suppose he'll do that. It's all taking longer than I had hoped :(

    Caves
    The modeler I got for this originally had a different idea of quality, and complained a lot when he was asked to fix mistakes he made. He also had this nasty habit of sending me "finished" things he hadn't actually tested in Unity, which just wasted my time. Some money spent on basically things I can't really use. However, I'm hopeful that the modeler who is working on the Medieval Village can take it up. Below is a preview -- piece was made by him, textured with Substance Designer. The image shows how I used a vertex painter application to blend between two different textures in order to minimize the visibility of a seam. The goal is to allow you guys to use any texture you want, so you can create any cave look you want, but that means seams will *always* be present. I've built some techniques to minimize it, but this is so far the best. Open it full size to see it better.



    Medieval Village
    I was hoping to get some custom grass/trees/etc made. I've made some speed tree trees myself. But this looks like it won't happen, so I may end up using foliage from Unity projects in the demo, as I've seen other environment modelers do similar. With that out of the way, I'll build a demo scene with what I have now and see if there are any other pieces I *need* to have before release. I also need to go over the textures again and make game-ready versions. There will of course be customizable options though. But for the environments, I'm basically looking to always include a game-ready version now.

    Dungeon Update
    I'm going through the materials and texturing them in Substance Painter to give a unified game-ready selection. Everything will still be customizable. There are new models that will be included, and the same modeler from the Cave/Village, or another who did good (But really slow...months long slow) work will make more pieces, specifically larger "entrance" pieces and the ability to connect w/ the cave and/or village.

    Characters
    Medusa
    Still being animated by the best animator I have. She's a bigger project, but I'm hoping t'll be done soon.

    Bats
    They'll start animation after Medusa

    New Characters
    I don't have any other creatures on the road map beyond those two. Elves & Half-Orc both have bodies ready for rigging, but need clothing first.

    Blend Shape updates
    The following characters need blend shapes (mesh morphing), and will get those soon -- work is starting on it: Demons, spiders, Dragon, Human.

    For the human, my goal (not sure if it's possible), is to have the head stitched onto the body, and make the three heads basically blend-shape options. So you can blend from one to another. Again, not sure if this is possible, but we'll find out. I'd prefer just a single head with mesh morphing.

    Other Updates
    We're continuing with music and sound effects. Concept art is basically caught up. She's currently doing some for the Weapons & Armor pack, but after that she'll need to wait for the characters to be more textured. She may be able to do the medusa or bat before they're ready...but maybe not.

    Sound effects are being done by one sound designer. We're moving towards a more clip-based system, rather than a sound-per-animation system. This provides more flexibility, and with the new Clip Combiner script (which will be included in all updates from here on out), you can create your own single clips to be used. This is good for mobile.

    Music is being made by one composer. He's finishing up the 4th song for the Monster Pack #1, and then there are two more for Monster Pack #2. We've decided to do them in groups that all have similar "themes", and that seems to be working out really well, so that the 4 songs in Monster Pack #1 all are very different, yet work really really well together. The monsters are all nature-based as well.

    I'm working on a script similar to the Clip Combiner that will export all snapshots from an Audio Mixer to .wav files. So far I'm having a few issues, but with GDC coming up I should hopefully be able to get some assistance from Unity people directly. We'll see.

    YEP. So there's a bunch of updates! :D
     
  28. Acissathar

    Acissathar

    Joined:
    Jun 24, 2011
    Posts:
    677
    Does this mean Elves need just a little more work, or that they're currently tabled and need a lot of work? Just curious, because as I may be reading these wrong.

    It might be because I'm blind, but I can barely notice the seam in the left, let alone the right one so I'd say it's working!

    Would the foliage take advantage of Substance? If so that sounds really interesting, otherwise I'm not sure if it'd be worth it considering Speed Tree is supposed to have some performance integrations with the engine. I look forward to seeing what you've got though compared to the few teasers we've gotten so far ;)

    Please tell me the chainsaw sword is getting a piece. That's still my favorite one haha :)

    My unsolicited feedback aside, these huge update posts / emails are nice. It makes me really glad I bought into the subscription to support it. Who knows, maybe with all of these packs being released, the charges will motivate me to finish my game ;)
     
    JBR-games, Xepherys and infinitypbr like this.
  29. infinitypbr

    infinitypbr

    Joined:
    Nov 28, 2012
    Posts:
    3,149
    Finishing the game is *always* a good idea :) I make a solid $3-$4 a day from "The Barbarian"....well worth the 2+ years of development................... [But seriously, I need to figure out how to get it onto Steam. I'd like to make another $3-$4 a day from that if possible]

    The Elves need the wardrobe done. They're naked as of now. (Though, they do have a version of the human clothes that fit their body). But before they get rigged and animated we need the wardrobe. I know I'll need more wardrobe after the three new characters -- full armor sets etc -- so I was hoping to find a wardrobe savant. So far, I haven't.

    If you can't see it in the left image, that's good! It's less visible i the right :D

    Substance Designer helps to make the leaves customizable to some degree. I had worked on the idea of doing a procedurally generated leaf system...got some of the way there, but wasn't able to make a "card" (a branch with multiple leaves) properly. So the trees you may have sen in the image are customizable to some degree ,but not to the degree I had wanted. My personal goal was to make the leaves "sprout", then turn brown, and then fall off, with options for snow. But that's a tall order.

    Chainsaw sword did not make the cut. It's too niche -- there will be 7 images: Sword, Shield, Helmet, Staff, Axe, Spear, Mace
     
  30. Acissathar

    Acissathar

    Joined:
    Jun 24, 2011
    Posts:
    677
    Totally understand on the chainsaw sword, I'll just have to settle with the fact it exists in the first place!
     
    infinitypbr likes this.
  31. jonlundy

    jonlundy

    Joined:
    Apr 15, 2016
    Posts:
    25
    Any update on Skeletons? That is the pack that I'm looking forward to the most. I know on your webpage it is listed as being modeled. I know there are a ton of skeleton models on the store, but I was looking forward to your version.
     
    infinitypbr likes this.
  32. Xepherys

    Xepherys

    Joined:
    Sep 9, 2012
    Posts:
    204
    If you put what you have on github (if that's an option for you), I'd be happy to take a spin at some of the procgen parts. This is slowly becoming my thing. I'm not an expert yet, but large chunks of my game are procgen, and I'm starting to get a feel for it. At any rate, no promises, but I'm trying. I'm still in the processing of converting all of your .js files to .cs as well. You're welcome to toss them up on your github as I get them done if you'd like. I did get the SFB Audio Controller migrated: https://bitbucket.org/snippets/Xepherys/A5jgj/sfb-audio-controller-converted-to-c-unity

    I have some other ones done but am at work for now, so... don't have access to upload them. The biggest thing I recommend as you start moving to C# is to type everything rather than using var. Yes, C# will type those variables for you, but typing them upfront makes the code more readable.
     
  33. infinitypbr

    infinitypbr

    Joined:
    Nov 28, 2012
    Posts:
    3,149
    Ah yes, it's the pack that's always "next", but then I ended up moving the humanoids up instead. The plan for the skeleton is to make a version of its wardrobe that works with each humanoid, and vice versa.
     
    JBR-games likes this.
  34. infinitypbr

    infinitypbr

    Joined:
    Nov 28, 2012
    Posts:
    3,149
    Thanks! The thing with me is that I often lack the most basic info. So when you say "type everything" what do you mean?
     
  35. Xepherys

    Xepherys

    Joined:
    Sep 9, 2012
    Posts:
    204
    Sorry, so don't do things like:

    var i = 6;
    var s = "words";
    var audio = <someAudioController>;

    instead, do:

    int i = 6;
    string s = "words";
    AudioController audio = <someAudioController>;
     
    chelnok, infinitypbr and Sovogal like this.
  36. Sovogal

    Sovogal

    Joined:
    Oct 15, 2016
    Posts:
    100
    Var is just syntactic sugar.

    I have no issues using it or seeing it, but my preference is to use verbose variable names so you don't have to continually refer back to their type. I hate abbreviations because they're inconsistent and they take one more step to mentally process when you're trying to conceptualize the logic of some code snippet.
     
    Last edited: Feb 8, 2017
    Xepherys and R1PFake like this.
  37. R1PFake

    R1PFake

    Joined:
    Aug 7, 2015
    Posts:
    533
    I disagree with this one: var is shorter, easier to replace if you want to change the type of a variable for whatever reason and it's still clearly readable what type it will have. For example:
    List<int> list = new List<int>() <- makes no sense to type List<int> twice, if you use var instead it's still very clear that the list will be of type List<int>
     
    Enoch and Sovogal like this.
  38. tchris

    tchris

    Joined:
    Oct 10, 2012
    Posts:
    133
  39. infinitypbr

    infinitypbr

    Joined:
    Nov 28, 2012
    Posts:
    3,149
    I always thought that C# required the type to be stated, while the javascript variant did not. Of course I learned this 4 years ago, so maybe things changed since then.

    I still forget to put an "f" after a float value :D
     
    Xepherys likes this.
  40. Xepherys

    Xepherys

    Joined:
    Sep 9, 2012
    Posts:
    204
    Sure, for that example it's obvious. It's not always so obvious, especially when dealing with custom classes, or even Unity's built in classes. I've seen far too many example where a var makes it tough for someone else to see what's being used. For instance:

    var position = Matrix.GetTranslation(ref transform);

    The variable position is of type Vector3. This is not clearly obvious from the declaration. You're correct, var is quicker and easier, but it's also (in my opinion) the sloppy way to declare variables and makes it potentially much more difficult for someone else to read and modify your code.

    Here's another:

    var markerOffset = socket.Transform;

    You might skim over it and say, oh, it's a Unity Transform object. But it's not. Socket is a custom class, and it's .Transform property is a Matrix4x4.

    So, while in a very simple program that maybe uses only .NET classes it may be "clearly readable what type it will have", in even a slightly more complex program that's not always the case. And rather than have var in some places and a specified type in others, it's good practice to simply always declare an explicit type.
     
    JBR-games likes this.
  41. infinitypbr

    infinitypbr

    Joined:
    Nov 28, 2012
    Posts:
    3,149
    GUESS WHAT
    I'm very proud of myself because I was able to hack together a script that lets me export single Snapshots or batch export all the Snapshots from any given Audio Mixer (so long as it's set up properly). The script is in C#, and very well commented, and works really really nicely.

    The plan is to release it with all of my packages (in updates for those that already have music), to allow other composers to include it in their packages*, and sell it stand alone on the Asset Store for something relatively low. I also will likely make it open source and put it on GitHub with a link from my site.

    * As far as I know, no other composer on the Asset Store is currently releasing their work in layers. I want to change that. I know some composers will balk at the idea that users could change the mix of their compositions. While I get the feeling, I think in the game industry it makes no sense. An amazing song may not fit perfectly into a game without some minor changes.

    And also, for anyone who has paid attention to the music we've been producing for the Infinity PBR models, re-mixing the tracks can create vastly new sounds that really don't sound at all like the original, and often have drastically different moods.

    So I'm hopeful that this script, and me allowing them to use it for free in all of their packs, will encourage composers to start releasing their work as ready-to-use songs like they already do along with the layers and a demo scene so users like myself and like you can really fine-tune the sound to fit our games.
     
  42. tchris

    tchris

    Joined:
    Oct 10, 2012
    Posts:
    133
    JBR-games likes this.
  43. infinitypbr

    infinitypbr

    Joined:
    Nov 28, 2012
    Posts:
    3,149
    https://www.infinitypbr.com/BlendshapeScriptUpdate.unitypackage

    This updates the Blend Shapes scripts. It won't break any preset files you already have, but it does change the inspector a bit, and adds Randomize buttons as well as constraints to the random range, so you can limit the minimum and maximum value that can be chosen during a randomize action. It's pretty sweet. I'll be updating the script the C# when I get the chance, but for those who are using the blend shapes in game, this is a great update to make your enemies truly randomized.
     
  44. henmachuca

    henmachuca

    Joined:
    Oct 14, 2016
    Posts:
    105
    Hi, I was reading the Wish list from page 01 and I was wondering if those Human add-ons are coming anytime soon? And is the human pack the barbarian one?

    Here is the items that caught my eye:

    Wish List
    • Human Add-On: Angel
    • Human Add-On: Royalty
    • Human Add-On: Paladin
    • Human Add-On: NPCs
    • Human Add-On: Knight
    • Human Add-On: Archer
    • Human Add-On: Cleric
    • Human Add-On: Battle Mage
    • Human Add-On: Wizard
    • Centaur
    • Troll
    • Minotaur
    • Giant Rats
    • Snakes
    • Goblins Base Character
     
    infinitypbr likes this.
  45. infinitypbr

    infinitypbr

    Joined:
    Nov 28, 2012
    Posts:
    3,149
    The current plan is to get the Elf, Half-Orc and Dwarf base characters up, with their own individual wardrobe set. From there, I can make those sets work on all 4 bodies, so they can be interchangeable. (I think that'll work).

    And then once all 4 are done (all 8 genders), with blend shapes and all that, I'll be able to get full armor sets made that work on all 8 bodies with mesh morphing and everything. It just has to be done properly to avoid issues later.

    I'm hopefully having the clothing for both half orc and elf being made now (though this is the 3rd modeler attempting the elf clothing), and then the dwarf body/clothes after that. The human is about to start getting blend shapes, and there's a LOT (mostly in the face). The goal with that is to make sure we have the same shapes for each race.

    I'd like to open up the entire system to other modelers who can create their own stuff for the 4 characters. But it all has to be very standardized for that.

    I just purchased a license from an artist I found for a "Golem" creature which will be similar to a Troll. I'll be texturing it as a "cave golem". But a more legit "Troll" would be still on the list, as well as the rest. Centaur would happen after we have horses.
     
  46. infinitypbr

    infinitypbr

    Joined:
    Nov 28, 2012
    Posts:
    3,149
    Screen Shot 2017-02-20 at 6.52.40 PM.png

    I found a pretty cool model online, and started talking to the artist. I ended up licensing it so I could re-texture it, get it animated, mesh-morphable and all the good stuff. It's a "Golem" character, and this is the damaged/dirty Metal Golem.

    I'm not 100% sure how I'll set this up. The textures will take up a lot of space, and I kind of want to spend a lot of time making lots of versions. I may release a base character and then have add-on textures after for various kinds -- Jungle, Earth, Fire, Ice, Stone etc. Not sure yet, because it really depends heavily on how large the textures end up being. It'll be 4k (even though Unity doesn't yet support 4k .sbsar files, they will one day).

    We shall see!

    On a positive note ,this is the first time I've licensed a model where it actually was CORRECT right away, without any changes needed.
     
  47. Velo222

    Velo222

    Joined:
    Apr 29, 2012
    Posts:
    1,437
    Hi sfbaystudios,

    Is there any chance you could update the "Gargoyles" asset package with 4K textures sometime? I love the model and I'm wanting it to be the main character in one of my games, but 2048x2048 textures seem like they're getting old fast. 4k+ textures would "modernize" the asset quite nicely.

    Just wanted to ask. Thanks.
     
  48. infinitypbr

    infinitypbr

    Joined:
    Nov 28, 2012
    Posts:
    3,149
    I'll look into updating the Gargoyle -- however, 4k won't be possible until Unity works with 4k .sbsar files. Some of my files (not the gargoyle) already are 4k, but you only see options up to 2k in Unity.
     
  49. AlturaStudios

    AlturaStudios

    Joined:
    Feb 21, 2017
    Posts:
    3
    Are you going to make your packs available for other engines anytime soon?
     
    infinitypbr likes this.
  50. infinitypbr

    infinitypbr

    Joined:
    Nov 28, 2012
    Posts:
    3,149
    Well, they already work with Unreal (and I'm assuming the rest) as the models are standard .fbx files, textures are standard .png files and animations are included with the models. Audio is standard as well.

    The Mushroom Monster Pack is on the Unreal Marketplace now, and Giant Worm Pack will go up tomorrow.

    From what I gather there are some slight differences that I am accounting for. First, the animations -- Unity wants the animations to be in a single long take .fbx file. Unreal wants them all separated. So the "Unreal version" simply has them separated. I've been told there may be similar issues with the use of sub-meshes, but I haven't looked too much into that yet. I also don't know if the blend shapes work in Unreal.

    Other Unreal issues: The store itself is much more strict about things, so I'm not allowed to include the concept art or .sbsar files (Substance requires a plugin in Unreal, and doesn't have the ability to export maps like you can in Unity). I'm including Audio but not music in the Unreal version. In all cases, though, anyone who registers their purchase on InfinityPBR.com will have full download access to all the bonus stuff. Of course I'm also not allowed to include a "read me" file in the Unreal packs, so hopefully people will read the description and actually contact me when they buy it.

    In the end my suggestion for Unreal users is to use both engines. Use Unreal to make your game, but use Unity to do all the customization stuff, as the scripts I've written go a long way to making the process fast and easy. Not just for the textures, but the music as well.