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

After playing minecraft...

Discussion in 'General Discussion' started by jc_lvngstn, Oct 8, 2010.

Thread Status:
Not open for further replies.
  1. Aguy

    Aguy

    Joined:
    May 11, 2012
    Posts:
    317
    After reading this thread...

    I may have become a convert. I did not like this style of game but now I may want to try to use it for my RPG concept. Not the building part and all that, just the look. Sort of like 3D Dot Game Heroes. Just need to get a better handle on the programming side.
     
  2. goldbug

    goldbug

    Joined:
    Oct 12, 2011
    Posts:
    766
    The geometry of the world is so simple, tangents are not a big deal. Everything is rectilinear, there are only 6 possible normals and 6 possible tangents. You can pass them as part of the geometry, or you can calculate the tangent from the normal inside the shader. I tried both, it was just about the same.

    That algorithm in your link is an overkill for this geometry. For every vertex you add, you know if it is for a face that is pointing up, down, east, west, north or south. Therefore you precalculate the 6 possible normals and tangents and assign them based on which face you are looking at.
     
  3. VeTaL

    VeTaL

    Joined:
    Jul 2, 2012
    Posts:
    125
    Thanks, so now i know that i should jump into tangetns calculation :)

    Ah, so tangent is "kasatelnaya". Oh, i definitely should look at wiki before posting that question.
     
  4. VeTaL

    VeTaL

    Joined:
    Jul 2, 2012
    Posts:
    125
    Ok, so i added logging for that long tangent calculation and i get this result:
    Normal: (0,1,0) Tangent: (1,0,0,-1)
    Normal: (-1,0,0) Tangent: (0,0,1,1)
    Normal: (1,0,0) Tangent: (0,0,1,-1)
    Normal: (0,0,-1) Tangent: (1,0,0,-1)
    Normal: (0,0,1) Tangent: (1,0,0,1)

    Looking fair enough: normal is normal, tangent is tangent.
     
  5. mgrenier

    mgrenier

    Joined:
    Apr 26, 2011
    Posts:
    57
    Been following this thread for a long time without actually post since I'm not doing anything with voxels.

    Having said that, I though you guys might interested in this http://media.tojicode.com/zelda/lttp.html. He is rendering (with WebGL) all the map using 1 quad + 2 textures : a spritesheet and map (consist of tile indexes stored in the RG component).

    I though that with a lot of work, you could render a 32x32x32 chunk using 32+32+32 quads, 2 textures and 1 sprite atlas instead of 32*32*32 quads and 1 texture.

    Just my 2¢

    Edit 1: Might not be as I described, but surely there is something in there for you guys to chew on (memory speaking)

    Edit 2 : Here some early test I did :

     
    Last edited: Aug 3, 2012
  6. GibTreaty

    GibTreaty

    Joined:
    Aug 25, 2010
    Posts:
    792
  7. goldbug

    goldbug

    Joined:
    Oct 12, 2011
    Posts:
    766
    I also saw that and started working immediately on using it.

    I believe Color is 16 bytes, and Color32 is 4 bytes, so this change allows me to save 12 bytes for every vertex

    So for every vertex right I generate:
    1 vertex position: 12 bytes
    1 uv position: 8 bytes
    1 normal: 12 bytes
    1 tangent: 12 bytes
    1 color: 16 bytes now 4

    So per vertex: before: 60 bytes, after: 48, for a savings of 20%. This is a big deal.

    Update: I did the conversion and it works great.
     
    Last edited: Aug 10, 2012
  8. Qmaks2

    Qmaks2

    Joined:
    Jun 2, 2012
    Posts:
    25
    Hi all, looking for to buy minecraft engine.
    Requirements :
    1) A world made from blocks
    (2) Dynamic calculated lighting (advanced: with ambient occlusion)
    (3) Basic terrain generation algorithms. Ability to plug in new generation methods, including non-heightmap-based ones
    (4) Option for generating fixed size terrain (advanced: infinite world terrains)
    (5) Mechanics: digging and block building. Methods for programmatically simulate those operations
    (6) Support for read / write world game data. Separate world save file generation from actual save operation
    (7) Fluids (like water) calculations
    (8) Glass and leaf material
    (9) Light sources like torches
    (10) Advanced : falling down blocks are not attached to other blocks

    (11) Optimized for performance, not necessarily for space. So it should be very fast.
    (12) Runnable on web
    (13) C # code
    (14) Code should be clean, well organized and documented
    (15) Project documentation describing how to use it

    If you have the engine meets these requirements, i am ready to buy it, or to funding the development of this list of feature.
     
  9. goldbug

    goldbug

    Joined:
    Oct 12, 2011
    Posts:
    766
    @Qmaks2

    I don't know if you can find an engine that has all that. Not even Minecraft has all that (MC misses 11, 13, 14 and 15)

    I gave up on the idea of licensing my engine at the beginning of the year, the money was just not there.
    People often came with lists like yours and wanted to pay something like $500 with no royalties.
     
  10. Qmaks2

    Qmaks2

    Joined:
    Jun 2, 2012
    Posts:
    25

    I can pay more then 500$. If you have an engine, just write your price and we'll discuss it.
     
    Last edited: Aug 15, 2012
  11. Foam

    Foam

    Joined:
    Jun 13, 2012
    Posts:
    322
    A quality engine with all of those features would probably run you at least $10k-$20k + royalties.

    The problem with this sort of engine is that most people want to create a game not too different from the engine that's already there---the engine is most of the game because so much content is generated procedurally. So it makes little sense to sell it for a mere $500 to a handful of people when you could sell an actual game with not much more effort for $5 to thousands of people.
     
  12. goldbug

    goldbug

    Joined:
    Oct 12, 2011
    Posts:
    766
    You hit the nail in the head. Once you get the block engine working properly, turning it into a game is a relatively minor effort. It is a lot more profitable to just run that last mile, and sell a game to thousands, than to license the engine to a handful of people for $500. This is probably the reason why there are no engines like this for sale in the asset store.

    Also, once you sell it, you will find yourself competing against your own code if you do decide to make it a game. The people you license it to, are going to come up with something very similar to your game.
     
  13. khanstruct

    khanstruct

    Joined:
    Feb 11, 2011
    Posts:
    2,869
    I don't know about that. I read an article recently explaining how the guys at Epic are doing so well because they not only make games, but also license the engine they use to make those games. Even when game sales are in decline, Epic has always prospered.

    Granted, this is on a much smaller scale, but the principle still applies.

    I think there could be a lot of uses for a "Minecraft" engine. Though 90% of them would be nothing more than Mincraft clones. However, most people that would license the engine would never finish their game. Of those that do, most wouldn't make a dime. This means that you're making money from games that never saw the light of day.

    Meanwhile, you're making sales off your own games as well.
     
  14. Foam

    Foam

    Joined:
    Jun 13, 2012
    Posts:
    322
    I finally have something to post. About 3 months ago I came across this thread and Unity as well, with the idea of making something similar, and this is the result so far. I want those of you who contributed a ton of info over the years to know that it's been greatly appreciated. :) This thread has been a real wealth of information and I've read through this thread and all its links several times over, and I really doubt I would have been able to make it this far without this thread. :)


    My code so far is pretty basic, and ugly, and all of that (note I work full-time as a developer so this is just what I've been able to fit in in the hours outside of that and everything else, like wife, family, friends, etc.), but, the basic engine is starting to become reasonable. Basic texturing, lighting, terrain generation (3D perlin terrain with 2D perlin as basic vegetation), swimming (not visible in video), and building/digging. Multithreaded and all that jazz. Reasonable algorithm performance. Chunking/un-chunking. Some custom shaders. etc.

    Which, BTW, is all written in Boo, cause Boo is awesome! :eek:

     
    Last edited: Aug 17, 2012
  15. HeadHunter2009

    HeadHunter2009

    Joined:
    Jul 3, 2012
    Posts:
    50
    Foam, your engine looks wery good, good work ;)
     
  16. SevenBits

    SevenBits

    Joined:
    Dec 26, 2011
    Posts:
    1,953
    Boo is da man! (But, personally, I like C#.)

    That looks great, to be honest! Looks you took the textures from Minecraft, eh? Well, I want to see a demo! You'd be release one before I unleash my fisticuffs!
     
  17. Foam

    Foam

    Joined:
    Jun 13, 2012
    Posts:
    322
    Thanks.

    Yes, I am using the MC textures for now for testing purposes. I'm thinking about replacing them with algorithmically generated textures.
     
  18. Qmaks2

    Qmaks2

    Joined:
    Jun 2, 2012
    Posts:
    25
    Question to all!
    I learn MinePackage engine. New chunk creates in this place of code :

    **** public void CreateFromChunk (Chunk.MeshData data)
    **** {
    ******** m_MeshFilter.mesh.Clear ();
    ******** m_MeshFilter.mesh.vertices = data.m_Vertices.ToArray ();
    ******** m_MeshFilter.mesh.uv = data.m_Uvs.ToArray ();
    ******** m_MeshFilter.mesh.colors = data.m_Colors.ToArray ();
    ******** m_MeshFilter.mesh.triangles = data.m_Indices.ToArray ();
    ******** m_MeshCollider.sharedMesh = null;
    ******** m_MeshCollider.sharedMesh = m_MeshFilter.mesh;
    ******** m_MeshFilter.mesh.RecalculateNormals ();
    **** }

    Function ToArray (), creates a new array in memory and provides a link to it in mesh.vertitses.

    So every building or destroy game make a lot of memory allocation. If you play for a long time, garbage collector will start collecting garbage and very slow down the game.

    How can I optimize this place? How do you create a new mesh for chunk in your engine?
     
    Last edited: Aug 26, 2012
  19. Foam

    Foam

    Joined:
    Jun 13, 2012
    Posts:
    322
    Well, I didn't read his code, but, presumably, it's like this:

    1. Mesh objects take array arguments for things like vertices, UVs, etc.

    2. However, arrays are fixed-size, and you often cannot know the size you will need until your iterate through your entire chunk, because the visibility on the mesh faces will be changing regularly, which changes the size of vertices, which changes the size of everything else (uvs, normals, etc.).

    This calculation is also the most expensive part of the mesh algorithm, so, while you're calculating out the size of the Lists, by calculating out the actual values you need, you might as well just add the values to a List while you're at it.

    3. When you're done with all of this algorithm and want to actually make the mesh exist, you create a Mesh object, pass in the Lists as Arrays (using ToArray()), set visibility options and such, and viola.


    You _could_ resize your arrays as you go along, but, this is typically very inefficient. You might be able to get away with creating a maximum sized array and shrink it when you're done but I doubt it's any more efficient than ToArray().
     
    Last edited: Aug 27, 2012
  20. GibTreaty

    GibTreaty

    Joined:
    Aug 25, 2010
    Posts:
    792
    I finally got the new terrain generator working! I haven't got it working with threading yet but I'll get there.

    InfiChunk
    - 16x16x16 Chunk Size - 3x3x3 Chunk Distance

    You can add/remove blocks, move between chunks and have new ones appear ahead of you. My new system uses a single flat block array and the blocks are shifted as you move through the world so it's faster than my last terrain generator. I still have to convert the chunk array to use a flat array too and that too will come in time.

    $Screeny1.png
     
    Last edited: Sep 2, 2012
  21. ligert123

    ligert123

    Joined:
    Jul 11, 2011
    Posts:
    2
    i have been looking at this thread for a while now and i have been wondering how you learn't how to use perlin noise?
     
  22. GibTreaty

    GibTreaty

    Joined:
    Aug 25, 2010
    Posts:
    792
    Code (csharp):
    1.  
    2. public static float GetNoise(Vector3 position) {
    3.         float positionZ = position.z / 8f;
    4.  
    5.         float noise = Mathf.PerlinNoise((position.x / 32) + (positionZ / 2), (position.y / 32) + (positionZ / 2));
    6.         noise += Mathf.PerlinNoise((position.x / 16) + (positionZ / 16), (position.y / 16) + (positionZ / 16));
    7.         noise -= Mathf.PerlinNoise((position.x / 8) + (positionZ / 8), (position.y / 8) + (positionZ / 8));
    8.  
    9.         if(position.y > 0) {
    10.             float noise2 = Mathf.PerlinNoise((position.x / 64) + (position.y / 32), (position.z / 64) + (position.y / 32));
    11.  
    12.             if(position.y > noise2 * 32) noise = 0;
    13.         }
    14.  
    15.         return noise;
    16.     }
    17.  
    Before I started using that, I was using the one in jc_lvngstn's minecraft package. Just play with it and see what happens, that's really all it took for me to learn coding.
     
    Last edited: Sep 3, 2012
  23. XavLar

    XavLar

    Joined:
    Feb 14, 2012
    Posts:
    143
    GIB! Great to see you're working on your terrain generation :)

    Are you thinking about releasing this for free like your other generators, like Free Terrain 3?
     
  24. GibTreaty

    GibTreaty

    Joined:
    Aug 25, 2010
    Posts:
    792
    Yea it'll be free as usual, it'll just have a less generic name. Since it's free though, I'll warn you that documentation is almost non-existent and lots of unused test-functions are still in the code.

    You can change the chunk size and distance in World.cs

    InfiChunk V1 Package

    When moving between chunks, I think most of the lag is coming from the ChunkUpdate function when shifting the blocks. Then afterwards it may be coming again from when the mesh is applied, I'm not 100% sure. I've tried using a Coroutine and a Thread and both ways cause a strange invisible chunk problem.
     
    Last edited: Sep 3, 2012
  25. XavLar

    XavLar

    Joined:
    Feb 14, 2012
    Posts:
    143
    Awesome thanks! I love seeing how that style of voxel terrain is coded, there's no tutorials on youtube or any video ones :/
     
  26. TylerCode_

    TylerCode_

    Joined:
    Sep 8, 2010
    Posts:
    221
    Looks like I'm not the only one who tried this. I didn't spend too much time cause I wasn't planning to do anything with it. but It was interesting to see how others went about it. Mine was basically 3 layers of grass blocks with a top layer salted with randomness. You could destroy and replace blocks (grass and "Torches") only though.
     
  27. mgear

    mgear

    Joined:
    Aug 3, 2010
    Posts:
    9,350
    Here is deepprofiler image (had to change chunk size to (8,8,8) and distance to (1,1,1) otherwise out of memory)

    *link to full image:
    http://forum.unity3d.com/attachment.php?attachmentid=38129&stc=1&d=1346773954
     

    Attached Files:

  28. Foam

    Foam

    Joined:
    Jun 13, 2012
    Posts:
    322
    Re: Perlin, I would suggest you check out LibNoise as well as the info @ http://accidentalnoise.sourceforge.net/minecraftworlds.html for a general idea of what's involved. The info @ that site is based around how LibNoise is built, that is, chaining various sources of noise together to get an end result. LibNoise is far, far superior to Mathf.Perlin.
     
  29. GibTreaty

    GibTreaty

    Joined:
    Aug 25, 2010
    Posts:
    792
    @mgear Thanks for the profiler insight. That helps me pin where the big problem is. I did find one reason why its spending so much time generating chunks though. In the ChunkUpdate function where it shifts the block array, I set each existing chunk to queue its mesh regeneration "chunk.queueMeshGeneration = true;". I realized that I didn't "need" to be doing that. The only time it would need to regenerate the mesh is if a chunk adds/removes a block on the edge of the chunk or it's lighting changes (which there is no lighting atm). Note, I haven't actually told neighbor chunks to regenerate if a new chunk has been added near it.
     
    Last edited: Sep 5, 2012
  30. Foam

    Foam

    Joined:
    Jun 13, 2012
    Posts:
    322
    Gib, keep in mind that with lighting you will likely have to regenerate all surrounding chunks when the center chunk changes.

    xxxxx
    xyyyx
    xyzyx
    xyyyx
    xxxxx

    If z is the center chunk that can be drawn (mesh), y are the chunks that can't be drawn but have their lighting calculated, and x are those chunks with have neither lighting nor a mesh generated, but do have terrain calculated.
     
  31. graphanite

    graphanite

    Joined:
    Sep 6, 2012
    Posts:
    6
    While working on my voxel world, I found that meshes don't get deleted when calling DestroyImmediate on a GameObject. So after some searching, I learned that you have to call DestroyImmediate on the mesh itself (e.g. "DestroyImmediate(go.GetComponent<MeshFilter>().mesh);"), and whenever you want to clean the memory of meshes, "Resources.UnloadUnusedAssets()".

    That worked, but the inconvenience of this method is that depending on the amount of objects the Garbage Collector has to through, you get a nasty CPU lag spike.

    I thought of a different approach to this problem. Instead of destroying the meshes and creating new ones, why not edit the existing meshes? That's where Mesh.Clear() comes into play. Clear() does not create a new Mesh, so there's no need for GC. (If this was obvious to you, I apologize. I didn't know this alternative existed at the time)

    So I wrote a class to help recycle meshes, which I included below. When you need a new Mesh, you simply call GetFreeMesh() and when you're about to unload a chunk, you call FreeMesh(mesh).

    For some reason, MeshFilter.mesh doesn't return the same mesh reference you fed it, so when you call FreeMesh() you have to use the mesh you got from GetFreeMesh(). (I save it in another component in the same GameObject).

    Also, you can't destroy the GameObject that holds the MeshFilter, it has to be recycled too. (I wrote a similar class for the GameObjects).

    Even though it's not a voxel world, my current project uses a lot of procedural meshes. I have about 800 meshes at any one time, which I update constantly. So I was forced to call UnloadUnusedAssets() every 30 seconds, which ruined the smooth loading and unloading of the world.

    Now, I'm rendering 872 meshes and running around unloading/loading my world :) I still call UnloadUnusedAssets just in case, but now I do it every 5 minutes.
    Keep an eye on VBO and VRAM in the stats window. You'll see they're kept in check.

    The code below is not the best solution (lags a lot at start). You could instead use a list, or if you already know the number of meshes, you could initialize the array with more than 0 elements.

    -

    View attachment $GeometryMeshHandler.cs
     
  32. GibTreaty

    GibTreaty

    Joined:
    Aug 25, 2010
    Posts:
    792
    I learned that the hard way too. When I first started on the project I was constantly deleting and making new Meshes and GameObjects. I didn't need to make another class to handle the recycling process though.

    In my Chunk struct, whenever I want to add in a chunk it will search for a GameObject that has a specific name and create a new one if none was found. Whenever I remove a chunk, it doesn't remove anything. It basically just sets a boolean in the Chunk to false and clears the 'sharedMesh' rather than the 'mesh'.

    Code (csharp):
    1.  
    2. public void Add() {
    3.         GameObject gameObject = World.GetChunkObject(nameLeft);
    4.  
    5.         if(!gameObject) {
    6.             gameObject = new GameObject(name, typeof(MeshFilter), typeof(MeshRenderer), typeof(MeshCollider));
    7.  
    8.             Mesh mesh = new Mesh();
    9.  
    10.             gameObject.GetComponent<MeshFilter>().sharedMesh = mesh;
    11.             gameObject.renderer.sharedMaterial = World.world.terrainMaterial;
    12.             gameObject.GetComponent<MeshCollider>().sharedMesh = mesh;
    13.             gameObject.transform.parent = World.world.transform;
    14.         }
    15.         else {
    16.             gameObject.name = name;
    17.         }
    18.  
    19.         gameObject.transform.position = position;
    20.  
    21.         Reset(true);
    22.     }
    23.  
    24. public void Remove() {
    25.         GameObject gameObject = World.GetChunkObject(nameLeft);
    26.  
    27.         if(gameObject) {
    28.             gameObject.GetComponent<MeshFilter>().sharedMesh.Clear();
    29.         }
    30.  
    31.         Reset(false);
    32.     }
    33.  
     
  33. HelloTherePeople

    HelloTherePeople

    Joined:
    Sep 9, 2012
    Posts:
    56
    I am using a package caled MinePackage for my game BuildWorld, but I badly need some help for a Right-click build function. Can anyone help? I badly need it.
     
  34. soulreafer

    soulreafer

    Joined:
    Nov 6, 2011
    Posts:
    28
  35. HelloTherePeople

    HelloTherePeople

    Joined:
    Sep 9, 2012
    Posts:
    56
    Yes, it probably is dead. I don't know about the developers too. He promised to help me with IDecoration C# script a couple days ago. I have never heard anything from him since. Sigh...... Same goes for the the other devs working on the BuildWorld game.......
     
  36. HelloTherePeople

    HelloTherePeople

    Joined:
    Sep 9, 2012
    Posts:
    56
    Kiyaku, who is SophieH, and can you provide with her code? I would happily appreciate it if you could. This post should have come around several years ago........................
     
  37. soulreafer

    soulreafer

    Joined:
    Nov 6, 2011
    Posts:
    28
    i think GibTreaty´s InfiChunk is a good basic next to bezzir´s. You could look at bezzirs code to find out how threading works and use this informations in infichunk because gibtreaty´s cames without generation in threads AND LAGS
     
  38. HelloTherePeople

    HelloTherePeople

    Joined:
    Sep 9, 2012
    Posts:
    56
    Wheres bezzirs code? DO I download the package? I already can generate worlds, but I need a building function.
     
  39. HelloTherePeople

    HelloTherePeople

    Joined:
    Sep 9, 2012
    Posts:
    56
    I just need a block engine with a building function. Then I all set. MinePAckage does not have that, netheir does InfiniChunk, and I am working my ass off trying to implement it.
     
  40. HelloTherePeople

    HelloTherePeople

    Joined:
    Sep 9, 2012
    Posts:
    56
    I cannot build...,.
     
  41. Foam

    Foam

    Joined:
    Jun 13, 2012
    Posts:
    322
    Look. To provide a "build function", look at how digging is implemented in that code and reverse it.

    The algorithms are the same:

    1. Generate a value for each block.
    2. Generate and display mesh for a "chunk."

    So, all digging is is

    1. Find out which block you want to change. Use Raycast to do this and calculate out the array position. Set it to null or whatever.
    2. Generate and display mesh for that "chunk."

    And all building is is

    1. Find out which block you want to change. Use raycast to do this and calculate out the array position (calculate the normal vector... see page 1 of this thread). Set it to 1 or whatever.
    2. Generate and display mesh for that "chunk."
     
  42. Foam

    Foam

    Joined:
    Jun 13, 2012
    Posts:
    322
    No, you're not. You're spamming this thread looking for someone to do this for you IMMEDIATELY because you haven't put in the effort to figure it out yourself and you don't know what you're doing and you're on a deadline and haven't realized this thread is 3 years worth of effort.

    Read through the thread. All the info you need is in it. Data structures. Algorithms. Lighting. Build/destroy. Textures. Physics. Math. Etc. It's all there.
     
    Last edited: Sep 18, 2012
  43. HelloTherePeople

    HelloTherePeople

    Joined:
    Sep 9, 2012
    Posts:
    56

    Thanks bro. That helped me alot. That just saved me when all else fails (Including smashing computer).
     
  44. HelloTherePeople

    HelloTherePeople

    Joined:
    Sep 9, 2012
    Posts:
    56
    SCORE! Building function implemented. I will be posting it as a package soon. Currently optimizing it for MinePackage. WOOT!
     
  45. Myhijim

    Myhijim

    Joined:
    Jun 15, 2012
    Posts:
    1,148
    Don't spam HelloTherePeople.

    It is quite obvious you are trying to promote "your" game based on MinePackage
     
  46. Ocid

    Ocid

    Joined:
    Feb 9, 2011
    Posts:
    476
    If anyones interested theres a series of tutorials here.

    I didn't make these AlwaysGeeky did over on TigSource so all credit should go to him but I thought I'd link them here just in case anyone was interested.
     
  47. Huzey-Wuzey

    Huzey-Wuzey

    Joined:
    Sep 18, 2012
    Posts:
    1
    Hey all. I'm only playing around with the MinePackage but was wondering whether anyone would be so kind as to explain me something?

    I want to try and make it so the blocks are bigger/smaller in scale.

    I have looked at tutorials about this and I think I half get what's going on(which means I don't). If you were simply generating a single cube the vertices would be at 0 or 2. And the cube would be twice the size.

    The way I have in my heads is the for loops in meshgenerator go to each position of a "grid" in a chunk with regard to its length, breadth, height and from that position and the chunk position a global coordinate is found and assigned to vertices of each block. Triangles are assigned from the vertices positions, I assume these are global coordinates to?

    Is this right thinking?

    Thanks
     
  48. HelloTherePeople

    HelloTherePeople

    Joined:
    Sep 9, 2012
    Posts:
    56
    Oh. I don't really think its prmoting anymore since I abondoned development yesterday. I just wanted to give out another package and make game open source. I am going to "revive" the game agian, but this time usning my own code.

    Serousily now, I need some stuff in Java. I don't know how to code C++.
     
    Last edited: Sep 21, 2012
  49. XavLar

    XavLar

    Joined:
    Feb 14, 2012
    Posts:
    143

    It would help if you learned C#, it's what the majority of Unity Users code with (besides JavaScript/Unityscript).
     
  50. mgear

    mgear

    Joined:
    Aug 3, 2010
    Posts:
    9,350

    Attached Files:

Thread Status:
Not open for further replies.