Blog |
In Polygonal Mind we've been heavily involved in Decentraland development and community for the past 2 years, and thanks to it we've been in many meetings answering questions about this Metaverse. This article is a recap of all the most common questions we've been getting about the platform explained for a non technical person. What Is Decentraland? Decentraland is a virtual world divided into squares of land of the same size. You can buy and trade this land and also build on top of it. All the content in the world is generated by the owners of the land, making it a huge collaborative space. How Did We Get Here? The project has been under development for longer than most would like to admit, and it is evolving on a very slow pace to my taste. This slow motion is probably because 2 years ago, most of the progress of the platform was not poured directly into developing it, but more into the financial aspect of it.
This was very criticized and tagged by many as a "money grabbing project" the progress the team was showing to the public was very focused on financial, while at the same time, various promises were broken on the technical side.
Many in the community felt very disappointed at the time, especially for the VR aspect. Decentraland as a concept drove many different people in investing for a very long term project without a clear route. But what many of us wasn't able to see at the time, was that having a very strong coin and assets before the actual platform would enable the growth of a development ecosystem from the ground up. Seen with perspective, it was a risky move, but the right one. I don't really know if this was made on purpose or accidentally. Decentraland As An Ecosystem To The Future During this time, there has been many initiatives to attract talent to the project. Game Jams, Funds, and contests, providing MANA and LAND. In the future, these initiatives, especially the game funds, will be managed by the Decentraland DAO. That will unlock funds to bootstrap projects pitched directly to the community. These type of events has motivated professional teams to invest their time into developing for the platform. This has been a great advantage against other platforms that haven't invested that much into attracting developers. It is highly important to allow monetization of your work as soon as possible if you want to retain creatives for the long run. Most of the times these payments were done in MANA, which has been increasing its price during last year, helping even more those teams who hold it as a financial asset to fund their ideas. Taking all of this into consideration, we can expect his internal ecosystem to grow slowly into a B2B market for the short term, that will evolve eventually on a play to earn economy. I Haven't Been In Decentraland Ever Before, How Can I Enter? You'll need a computer and a browser. The Graphics Suck Although this statement might hold some truth, there are various things to consider on the graphical style of Decentraland. The most important one is resource optimization, it is a web project that loads your 3D interactive land and everyone around you on real time, from your browser, and on top of that, is USER generated content, that can or cannot be prepared to run smoothly. Think about browsing a website, I'm sure you have experienced a bad website that takes forever to load because it has high resolution images. This is the same thing, but multiplied. So when you open a site, you open at the same time all the sites around it, some of them will work just fine, but others will work badly. Unfortunately, there isn't much we can do about this, for now. And if we think even more into the future, probably everything will be rendered on a cloud computer and streamed to your device, like Google Stadia does. I'm not very optimistic about this technology since it will need that most of the world uses a very high speed internet connection. But only time will tell. The second thing to consider on the graphic aspect is the style, and this is purely a personal taste opinion. This debate has been going for years on the videogame industry, hyper-realistic graphics against stylized content. There is no real answer to this. Stop. There are many things that Decentraland is lacking visually, we can all agree on that, but I expect the team to deliver them in the future. How Do I Become Rich Playing Decentraland? Unfortunately you can't, yet. How Can I Make Wearables? A very frequent question, right now, you need a license to mint wearables, and it is given by the DCL team. There is a reason behind, making wearables requires 3D modelling, texturing and rigging skills. Not everyone has them. We're in the early stages of the platform, and I guess the team is doing closed experiments with experienced teams and individuals to learn the best way to open the market later on. In the future we can expect:
What About VR This is one of the points that have brought many different debates and heated arguments to the community. It was promised in the Whitepaper, but discarded a few years back. Developing a platform is not an easy task, and a VR platform is even harder, so removing it from their roadmap was not a crazy idea at all, it has helped focus on bringing DCL to more devices than a VR focused project could potentially do at the moment. It has been stated by the Decentraland team that VR is not a forgotten thing, just postponed. So eventually we'll be able to experience Decentraland with our favorite headset. When? Not anytime soon pal, probably in 2022. Why LAND Is So Expensive? There are various reasons behind this, the most obvious is scarcity. There is a limited amount of them and in order to make more, the community has to vote for it. Building on it isn't easy either, you need some expertise to create something worth visiting. We can't deny that the market has gone wild and has been pumping prices for a while, leading to what we have today. But at the same time it has shaped the vision of the project into a more B2B approach rather than the B2C we all had in mind. For a business, buying and investing into Decentraland is way more reasonable than a regular person. Why Should I Buy LAND If I Got Funding To Build My Own Virtual Space? Many old fashioned businesses are starting to consider their own Metaverse presence and this question pops very often on their head. The Metaverse is and will be infinite, endless layers and worlds that we can access anywhere from many different devices. You'll be lost and very easily as we get deeper on the internet. Decentraland will act as an attention beacon for users, pretty much like any social media platform does these days. So you might want to build your own personal space outside these Metaverse platforms, but you'll need to invest a lot of efforts to attract users there and retain them. And I'm not just talking about advertising, you'll need to develop interaction on your own, servers to hold visitors, avatar systems, interactivity, etc. Not saying that is impossible, but it will take way more time and funding than having your parcel in Decentraland. I would say that having a small presence on Decentraland (or any other platform) and linking it to your personal space will be the most logical option in the future, just like you have your Facebook page and your own website. Conclusion This is just a highlight of the many different questions we get everyday, my goal this time has been to explain how Decentraland has been evolving in the last few years from an insider look. But there are lots of different questions that I haven't included here, so stay tuned for more Decentraland insider looks. As a final reminder, Decentraland is a collaborative layer of the Metaverse, just like Facebook is part of the internet. If everything keeps evolving steadily it might become the business cluster of the future. See you around the Metaverse!
0 Comments
Introduction So you are new to all this Metaverse economy and you are having trouble understanding what's going on. You want to start investing some time and maybe even money on it, but you are not sure where to start... Well, you are in luck, this post is for you! In the last two years, we've been involved in many Metaverse projects, building and generating value across different platforms. In this article we'll dig into Blockchain Metaverse projects, the ones we know and what you should consider before starting your journey. There are many different Metaverse projects out there, but today we'll compare the best known in the space on different points, so you can have enough information before digging further on them. Before starting you must understand the Metaverse as a concept. NONE of these projects alone are the Metaverse, even if they say so on their marketing efforts. They are LAYERS of the Metaverse, and all of them combined are the Metaverse. In easy terms to understand, Facebook is not the internet, but a part of it. Same applies here. The Metaverse Projects, A Brief Description Decentraland The oldest one in the space. It is a single Metaverse layer divided evenly into a grid. Every single coordinate is called LAND. All the LAND is the same size and has the same limitations. Users can combine their colliding LAND into Estates. Users can create districts to coordinate themselves and this one function as separated entities/companies. There is a limited supply of LAND and there is no way to create more unless the community proposes it through the Decentraland DAO. The world was open on 20/02/2020 CryptoVoxels Minecraft-like inspired project. It is a single Metaverse layer divided unevenly in different plots and islands. There is a main island called Origin City that has a limited supply of parcels. Their team is always generating new islands and parcels as a way to fund the project. Every plot has a different size and limitations. The world was open on July/2018 Somnium Space High end devices focused project. It is a single Metaverse layer divided unevenly in different plots along an already generated map with some islands too. Every plot has different size and limitations. The team is releasing new land once in a while. The world was open on 20/02/2020 The project also has a new proposal for owning whole Metaverse layers, called Somnium Worlds. But there is little information about this yet. The SandBox Evolution of a previously very successful non-blockchain project into a new paradigm. Also with Voxel art. It is a single Metaverse layer divided evenly into a grid. All the land is the same size and is pretty big, users can combine their plots into estates to generate bigger places. There is a limited supply of land there is still a big part of it not released to the market. The world is still in private beta, aiming to launch in Q1 2021 How Is The Experience? When we talk about Metaverse layers we're talking about content being deployed on the same "world" meaning that in theory you could be able to "walk" from one point to another without any loading screen, so when you join the place, you can see your parcel and everything built around it even if this content is built by another person. This is the case of Decentraland, CryptoVoxels and Somnium Space, they all got a seamlessly walking experience. As opposed to the other projects, Sandbox encapsulates their land experiences into separated scenes and when you walk from one parcel to another, there will be a loading screen. How Can I Access The World? Decentraland Desktop Website: https://decentraland.org/ CryptoVoxels Desktop, Mobile Website and VR: https://www.cryptovoxels.com/ Same experience in any device. Somnium Space Full version: Desktop Client and High end device VR headset. Reduced version: Desktop Web and Quest. https://somniumspace.com/ The reduced version is encapsulated in different instances, meaning that you can only visit 1 plot at a time. Web based visitors cannot see client visitors and vice versa. Avatars are also limited to the web version. The Sandbox Who Is behind The Wheel? Decentraland The project started with Esteban Ordano and Ari Merlich, both very experienced folks on blockchain and high end technology and did a very successful job creating and pushing the idea. Now the project is managed by the Decentraland Foundation, a new entity that is focused on listening to the community needs. Most of the team is in Argentina. CryptoVoxels By the one and only Ben Nolan. This solo entrepreneur from New Zealand started off the project from scratch and now has a team helping him to generate his vision. They are very active listeners on their Discord and Twitter. Somnium Space Funded by the serial entrepreneur Artur Sychov, the project started with a very successful indiegogo campaign back in the day. Based in the beautiful city of Prague, right in the heart of Europe. The Sandbox The Sandbox project was initially started in 2012 on mobile platforms which to date have gathered more than 40 million global installs on mobile devices. Their 100-people strong team behind has over 15 years of experience making games. Over the past 3 years, The Sandbox team has been developing a new version of the game – this time as a 3D, multiplayer platform using blockchain technology (Ethereum) to offer a virtual world where players can build, own, and monetize their gaming experiences. This is the version we are comparing today. What Can I Do On These Platforms TODAY? From afar all these projects look very, very similar, but they are actually not, they all have different communities with various mindsets. Decentraland This project has made a huge effort into building collaborations and partnerships with top blockchain and crypto projects around the world, there are many virtual headquarters built in there already and more to come in the following months. Events and networking is what is driving Decentraland adoption. You can keep up to date with their events on the website. The platform has also a lot of cryptoart galleries and a few games to enjoy. But be aware that most of the place is still empty. CryptoVoxels If you want to get inspired quickly, you MUST visit CryptoVoxels. In 2020, CryptoArtists from all around the world have taken over this platform generating mind blowing content. The world is filled with art galleries and the community is super active. This project has the best boarding experience on Crypto-Metaverse so far. There are many art and business related events in the world, but there isn't a centralized way to find them, you must follow each micro community individually. Somnium Space The main selling point of the project is its beautiful image rendering. If you own a high end VR device, Somnium is for you. The community is small but cozy, very active and welcoming on their Discord. They also got an event page to keep track of all the events. Art galleries and private land is the content you'll find there. The Sandbox The project is unreleased yet. But I can give you a glimpse of what you'll find. Games, games and more games. Their team is making a great effort to build a game platform along with many creators. With their background on the industry and how they communicate, I expect SandBox will become a great gaming platform. They are using Arkane Network, which makes on boarding for blockchain newbies very easy. What About Building Things? Alright. So you want to have something built in your new virtual domains, these are the things you need to take into account. Decentraland This platform has 2 ways of building. The Builder: This online tool allows users to place and allocate 3D models in the parcel and then deploy. What you can do with it is very limited. The SDK: Tool developed for professional teams to generate interactive content in the game. Probably very complex for starters, but very good if you want to have something very unique on your parcel. We've made different games and experiences with it. Developing with DCL SDK is still a very niche thing and takes A LOT of time, so be prepared to hire a professional team. CryptoVoxels The easiest and most friendliest of them all, just join CV and start placing things in your land while playing. You can find many artists willing to take building commissions and they'll create amazing stuff by pushing limitations to the next level. The great downside right now is that you can't create any complex behavior on CV, so no games. Somnium Space There is a Somnium Builder that works very well, it is very similar to the Sims building creator tool and it allows you to make your own place out of already generated assets. There is a Unity SDK in the works for Somnium, but no release date yet. The Sandbox This project has developed 2 different tools for content creators: VoxEdit: that allows to create game items and characters. Game Maker: This tool will take the assets generated on VoxEdit and place them in world, also adding interaction and complex behavior for them. No code required. Since the platform is not released, it is still hard to find people to develop in your SandBox Land. What Is Their Economy? All the platforms, released or not, got some economy going on, based on different stuff. Decentraland They have their erc20 token called Decentraland MANA ($MANA) Probably the strongest coin of all the platforms and listed on the most well known exchanges. 1 MANA ≃ $0.116 Their LAND economy is also pretty hot, the lowest prized LAND on OpenSea right now costs 8,000 MANA ≃ $924.3 This project also has wearables made by their team and community, you can also buy and sell names on Decentraland. CryptoVoxels They don't have any coin anymore. It has a very small wearable economy, but unfortunately generating new tokens it's been closed down due Ethereum gas fees many times, making it very difficult to generate a stable revenue for creators. Cheapest parcel on Opensea: 1 ETH ≃ $1,236.61 Somnium Space They have an erc20 token called Somnium Space CUBEs ($CUBE) 1 CUBE ≃ $0.3 But their team has made claims that they want it to become a stable coin. Cheapest parcel on Opensea: 0.68 ETH ≃ $839.5 The project has also created their own virtual reality avatar market, only usable on Somnium client version. They also have released a world token. But they haven't released much info on this yet. The Sandbox They have an erc20 token called SAND ($SAND) 1 SAND ≃ $ 0.05 Cheapest parcel on OpenSea: 0.1 ETH ≃ $122.7 Any item created and uploaded to SandBox will be automatically an NFT, so expect a huge boom of NFT trading from this project once is released. How Does The Future Looks Like For These Platforms? The following statements are made in Jan of 2021 and are based on how all these platforms have evolved along 2019-2020. This might shift as their communities become bigger and evolve. Decentraland Networking platform. Hopefully a decentralized virtual Silicon Valley of the future. Many big blockchain companies and influencers are setting their virtual business Head Quarters in there using districts as a catalyst. Unless LAND prices go down, the investment needed to buy a plot and then to develop content for it, is really high. This kind of budget makes sense for a B2B environment. CryptoVoxels Micro house-blogging platform. Pretty much like your 3D house blog. The team sets the prices based on FIAT in order to attract more BUILDERS. Many companies and influencers have a plot in CV too, but most of the plots are built by artist showcasing their art. It is amazing to see all the islands getting built these days. Somnium Space Virtual Beverly Hills neighbour for early blockchain enthusiasts and celebrities. Somnium parcel prices have skyrocketed in the last year. The community is small BUT very active and very well connected. The world looks like a green field, that can remind you of The Sims. The Sandbox Blockchain based Minecraft competitor. Is very difficult to imagine how this project will evolve without seen it released yet. But based on the previous SandBox game and the team background, we can already see this project being the only one fully focused on game development. Where To Learn More About The Projects? All these projects got Discord communities and Twitter accounts to follow their progress. You can learn more about them by following us too! Conclusion I just wanted to give some insight thoughts on these projects, since these are the most "HOT Blockchain Metaverse" projects in early 2021. All these platforms compete and work together at the same time. If one of them fails hard, it will affect negatively to the others, since they are all tied together with Ethereum. As I stated in the beggining, NONE of them are the Metaverse, they are just layers, collaborative worlds filled with used generated content. Ultimately the users owning and building the platforms will be the ones in charge of its success or failure, same goes for their tied coins. I haven't included any NON-blockchain projects on the list, but to give you some real facts with perspective about how EARLY we are in the space.... VRChat has today more daily active users than all of the platforms mentioned COMBINED. True ownership will be granted by blockchain, but only if the majority of users understand the value of NFTs and prefer it to centralized systems. We could keep comparing all the projects in the space in the future on different subjects, feel free to leave us ideas on our interoperable Discord community! Why do I need to modify the Unity plugin? Using the Decentraland SDK to place entities "manually" in the typescript code may be a slow and tedious process, especially if you have to put a lot of them and you have to look one by one if they are in the right place. That's why you have tools to help you build a scene, like the Decentraland builder or the Unity to DCL export plugin. However there are a limited set of things you can do with them. In this guide we'll see how to make custom modifications to the Unity plugin for DCL to expand the number of things you can export to code from the Unity scene editor. Before starting with this guide you should have a minimun knowledge of the Decentraland SDK, the basics of how to export a scene from unity to DCL and some programing basics (we'll use typescript and C#).
Prepare your Typescript project
It isn't necessary to make a custom component to place an NFTShape (which is already a component), but for the sake of the guide we'll do it anyway, besides it will be useful for you as a base to make your own more complex components. Before start writing code in your game.ts file, be aware that the Unity export plugin will ovewrite the entire game.ts file and your code will be lost, because of this we need to work in a separate file. Create a new file src/imports/components/NFT.ts with the following code: //Creates an NFTShape component with the given info export function createNFTComponent(entity: IEntity, smartContract: string, tokenId: string){ entity.addComponent( new NFTShape('ethereum://'+smartContract+'/'+tokenId,Color3.Blue()) ) } //Add a NFTdata component to the entity, creates an NFT component with the given info @Component('NFTdata') export class NFTdata{ entity: IEntity //entity of the NFT smartContract: string //Smart contract of the NFT tokenId: string //Token ID of the NFT constructor(entity: IEntity, smartContract: string, tokenId: string){ this.entity = entity this.smartContract = smartContract this.tokenId = tokenId createNFTComponent(entity, smartContract, tokenId) } } And another one src/imports/index.ts with: export { NFTdata, createNFTComponent } from "./components/NFT" Now we have our code ready for when our modified plugin exports the game.ts Make a Unity script to hold the data to export Create a empty script in Unity and open it in visual studio (or your favorite code editor). You only need to store here the NFT address info for this guide, but fell free to add anything you need for your project. public class nft_script : MonoBehaviour { public string smartContract; public string tokenId; } Now we have the data stored in our entity, the only step left is to modify the plugin to translate this data to our project in typescript. Modify the Unity plugin in C# Modifing the plugin may seem like an overwhelming task, but keep in mind we only need to add our little pieces of code in it and expand its functionalities, simple if you know where to do it. Open SceneTraverser.cs in the Decentraland plugin folder: Assets/Decentraland/SceneTraverser.cs Find the public static ResourceRecorder TraverseAllScene function and add the following code after the comment //====== Start Traversing ====== //====== Start Traversing ====== if (exportStr != null) { exportStr.AppendLine("import { NFTdata } from \"./imports/index\"\n\n"); } This will import our NFTdata class at the start of game.ts Next find the public static void RecursivelyTraverseTransform function and after exportStr.AppendFormat(NewEntityWithName, entityName, tra.name); add this code: nft_script nftObject = (tra.gameObject.GetComponent("nft_script") as nft_script); if (nftObject) { exportStr.AppendFormat(SetNFT, entityName, nftObject.smartContract, nftObject.tokenId); } Last step, find the place where the export strings are declared and add the SetNFT string at the end. private const string SetNFT = "{0}.addComponent(new NFTdata({0}, \"{1}\", \"{2}\")) \n"; This code will check if the exported entity has an nft_script and will add the NFT data component to the entity in our game.ts file. With all done your scene is ready to be exported to a typescript project and your resulting game.ts should look like this: import { NFTdata } from "./imports/index" var entity1372n = new Entity("NFTentity") entity1372n.addComponent(new NFTdata(entity1372n, "0x06012c8cf97BEaD5deAe237070F9587f8E7A266d", "558536")) engine.addEntity(entity1372n) entity1372n.addComponent(new Transform({ position: new Vector3(6, 1.5, 6) })) entity1372n.getComponent(Transform).rotation.set(0, 0, 0, 1) entity1372n.getComponent(Transform).scale.set(1, 1, 1) Final tips You can access from anywhere in the project to an array of entities with your custom components, this can be usefull to control where and how some components or behaviours start. engine.getEntitiesWithComponent(NFTdata) You don't need to make complex new components if you don't have to, for example you can export from unity only the info to put an entity in an array and apply to them a custom behaviour. Before start making your componets, take a look at the decentraland sdk and the decentraland utils library, they may have what you are looking for. ECS API Reference: decentraland-ecs-utils: npm install decentraland-ecs-utils Conclusion If you have understood the steps done in this guide, you are ready now to make your own components for decentraland and place them using the Unity editor, this will be very usefull to fill your scenes with gameplay and interaction. I hope it makes your development process for decentraland easier. Alex Picazo PROGRAMMER Videogame programmer, love developing cool stuff. Always searching for new interesting stories.
Decentraland official documentation Libraries and imports You need to install in your typescript project the eth-connect library, to interface with Ethereum contracts and call their functions. npm install eth-connect Also, you will need to import the following functions in your file. getUserAccount to obtain the user's ethereum address. getProvider to create an instance of the web3 provider to interface with Metamask. getUserAccount and getProvider are provided by the decentraland SDK. import { getProvider } from '@decentraland/web3-provider' import { getUserAccount } from '@decentraland/EthereumController' import * as EthConnect from '../node_modules/eth-connect/esm' For this libraries to work in the DCL localhost preview, you'll need to paste &ENABLE_WEB3 to the url, example: http://192.168.0.112:8000/?SCENE_DEBUG_PANEL&position=12%2C44&ENABLE_WEB3 Important information needed before start To perform a MANA payment you need to gather some info. Ethereum address to pay the mana, this will be the address that will recive the MANA from the user's payments. example: const PAYMENT_ADDRESS ="0x4tU......8dY" MANA units you want the user to pay example: const MANA_PAYMENT = 10 The MANA ethereum contract address const MANA_ADDRESS = "0x0F5D2fB29fb7d3CFeE444a200298f468908cC942" Fake MANA contract address (optional), only if you want to do test transations with Fake MANA const FAKE_MANA_ADDRESS = "0x2a8fd99c19271f4f04b1b7b9c4f7cf264b626edb" The MANA contract ABI Create a empty file inside your project, "/contracts/mana.ts" and paste the MANA ABI in export const abi, or paste the contents of this file.
<
>
export const abi = [{"constant":true,"inputs":[],"name":"mintingFinished","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"mint","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_value","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"finishMinting","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"remaining","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[],"name":"MintFinished","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"burner","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"} Fake MANA contract ABI (optional)
<
>
export const abi = [ { constant: true, inputs: [], name: 'mintingFinished', outputs: [ { name: '', type: 'bool' } ], payable: false, type: 'function' }, { constant: true, inputs: [], name: 'name', outputs: [ { name: '', type: 'string' } ], payable: false, type: 'function' }, { constant: false, inputs: [ { name: '_spender', type: 'address' }, { name: '_value', type: 'uint256' } ], name: 'approve', outputs: [ { name: '', type: 'bool' } ], payable: false, type: 'function' }, { constant: true, inputs: [], name: 'totalSupply', outputs: [ { name: '', type: 'uint256' } ], payable: false, type: 'function' }, { constant: false, inputs: [ { name: '_from', type: 'address' }, { name: '_to', type: 'address' }, { name: '_value', type: 'uint256' } ], name: 'transferFrom', outputs: [ { name: '', type: 'bool' } ], payable: false, type: 'function' }, { constant: true, inputs: [], name: 'decimals', outputs: [ { name: '', type: 'uint8' } ], payable: false, type: 'function' }, { constant: false, inputs: [], name: 'unpause', outputs: [ { name: '', type: 'bool' } ], payable: false, type: 'function' }, { constant: false, inputs: [ { name: '_to', type: 'address' }, { name: '_amount', type: 'uint256' } ], name: 'mint', outputs: [ { name: '', type: 'bool' } ], payable: false, type: 'function' }, { constant: false, inputs: [ { name: '_value', type: 'uint256' } ], name: 'burn', outputs: [], payable: false, type: 'function' }, { constant: true, inputs: [], name: 'paused', outputs: [ { name: '', type: 'bool' } ], payable: false, type: 'function' }, { constant: true, inputs: [ { name: '_owner', type: 'address' } ], name: 'balanceOf', outputs: [ { name: 'balance', type: 'uint256' } ], payable: false, type: 'function' }, { constant: false, inputs: [], name: 'finishMinting', outputs: [ { name: '', type: 'bool' } ], payable: false, type: 'function' }, { constant: false, inputs: [], name: 'pause', outputs: [ { name: '', type: 'bool' } ], payable: false, type: 'function' }, { constant: true, inputs: [], name: 'owner', outputs: [ { name: '', type: 'address' } ], payable: false, type: 'function' }, { constant: true, inputs: [], name: 'symbol', outputs: [ { name: '', type: 'string' } ], payable: false, type: 'function' }, { constant: false, inputs: [ { name: '_to', type: 'address' }, { name: '_value', type: 'uint256' } ], name: 'transfer', outputs: [ { name: '', type: 'bool' } ], payable: false, type: 'function' }, { constant: true, inputs: [ { name: '_owner', type: 'address' }, { name: '_spender', type: 'address' } ], name: 'allowance', outputs: [ { name: 'remaining', type: 'uint256' } ], payable: false, type: 'function' }, { constant: false, inputs: [ { name: 'to', type: 'address' }, { name: 'amount', type: 'uint256' } ], name: 'setBalance', outputs: [], payable: false, type: 'function' }, { constant: false, inputs: [ { name: 'newOwner', type: 'address' } ], name: 'transferOwnership', outputs: [], payable: false, type: 'function' }, { anonymous: false, inputs: [ { indexed: true, name: 'to', type: 'address' }, { indexed: false, name: 'amount', type: 'uint256' } ], name: 'Mint', type: 'event' }, { anonymous: false, inputs: [], name: 'MintFinished', type: 'event' }, { anonymous: false, inputs: [], name: 'Pause', type: 'event' }, { anonymous: false, inputs: [], name: 'Unpause', type: 'event' }, { anonymous: false, inputs: [ { indexed: true, name: 'burner', type: 'address' }, { indexed: false, name: 'value', type: 'uint256' } ], name: 'Burn', type: 'event' }, { anonymous: false, inputs: [ { indexed: true, name: 'owner', type: 'address' }, { indexed: true, name: 'spender', type: 'address' }, { indexed: false, name: 'value', type: 'uint256' } ], name: 'Approval', type: 'event' }, { anonymous: false, inputs: [ { indexed: true, name: 'from', type: 'address' }, { indexed: true, name: 'to', type: 'address' }, { indexed: false, name: 'value', type: 'uint256' } ], name: 'Transfer', type: 'event' } ] Code Now that we have all the info and libraries we need it's time to develop or code. Import the functions you'll need at the begining of the file. import { getProvider } from '@decentraland/web3-provider' import { getUserAccount } from '@decentraland/EthereumController' import * as EthConnect from '../node_modules/eth-connect/esm' Import the MANA ABI (or the fake MANA ABI for test only) import { abi } from './contracts/mana' Now you can create a simple payment function, to call when you want the user to pay. const PAYMENT_ADDRESS ="0x4tU......8dY" const MANA_ADDRESS = "0x0F5D2fB29fb7d3CFeE444a200298f468908cC942" const MANA_PAYMENT = 10 function payment(callback = function(error?, result?){}) { executeTask(async () => { try { const provider = await getProvider() const requestManager = new EthConnect.RequestManager(provider) const factory = new EthConnect.ContractFactory(requestManager, abi) const contract = (await factory.at( MANA_ADDRESS )) as any const address = await getUserAccount() const res = await contract.transfer( PAYMENT_ADDRESS, MANA_PAYMENT*1000000000000000000, { from: address } ) } catch (error) { callback(error) log(error.toString()) } }) When this function is called, the user's Metamask extension will popup a comfirmation for the payment, if there is a problem with the payment or the user rejects it, the payment() function will throw an error. If oyu want you can add your own callback(error, result) function to manage the success or fail of the payment request. payment(function(error, result){ if (!error) { //Payment success } else{ //Payment fail } }) Test with fake MANA payments
For the last step, you need to change the MANA contract address and the MANA ABI in your code for the fake ones. import { abi } from './contracts/fakemana' const MANA_ADDRESS = "0x2a8fd99c19271f4f04b1b7b9c4f7cf264b626edb" With this your test MANA payments will be done with the fake in the Ropsten Test Network, and will be sent to the PAYMENT_ADDRESS in the Ropsten network as well. Alex Picazo PROGRAMMER Videogame programmer, love developing cool stuff. Always searching for new interesting stories. With the release to the public of Decentraland, I was given a scene block out and I was tasked with the rearranging the elements around and making textures based on a moodboard for Sometimes a Thousand Twangling instruments (SaTTi, from now on). The Decentraland part of SaTTi consists in a series of banners where you can change what sounds are playing on them (which are generated from drawings) and that change the "music" depending on where you stop the banners and where you stand in the floor, making the sounds overlap in different ways and making the sounds come from different directions. After seeing the moodboard and knowing what the project was about, and because I was in a tight deadline, I decided to take the same approach for textures: layer generators, alphas, and other elements that already existed in Painter to create the needed textures.
The Floors This is the stack of fills, filters and generators I used to create the desired look. I won't share the exact settings of the effects because the point is to get straight the reason of why I used them
The Hexagons The polished ones I decided to approach these ones as a stack of different layers instead of using multiple fills and filters in a single layer, since it gave me more flexibility to create variations, specially controlling the different opacities of channels in each layer. So these are the layers and blending options I used for this:
The organic ones Again, I approached these as a stack of layers These are the layers and blending options I used for this:
Conclusion Not every texture made was used in the end, but it served to explore the aesthetic of the parcel, and we can always use them in case we want to update the scene or keep developing the visual aspect of it further. The fact that we used Painter to make the textures means that we can export the textures in 4k and change the size after to meet the limitations of Decentraland (max resolution 512x512 per texture). Each of the textures here had 3 more variations made to them. Changing the opacity, blending options, seed of the generators and effects lets you generate variants very easily when you're in a rush. Álex 3D GENERALIST Alejandro Bielsa is a junior 3D artist working at Polygonal Mind's in-house team. Passionate about videogames, vivid tutorial drinker and cat lover. Premise The 20th of February Decentraland was launched. For the ones who do not know, Decentraland is a virtual world backed by the Ethereum blockchain where its community owns the shape and purpose of their LANDs, creating an innovative and a dynamic relationship between landowners and visitors. With this premise, the sky is the limit. We got a chance to be part in the development of some LAND content prior launch, from adventure mazes and sound experiments to art galleries, gardens and even transit systems. Shaping the future of virtual transportation, today we are describing how we created the Trail Transit System in South Decentraland from scratch to its final patch prior launch day.
Before starting For this workflow, here at Polygonal Mind worked with a custom Unity plug-in that you can find at GitHub [https://github.com/fairwood/DecentralandUnityPlugin/]. This plugin allowed us to work natively from Untiy, compose and create all the scenarios without heavy coding. Note that we did not use the plug in in its vanilla version, we slightly modified it in order to be suitable for our custom environments, improve its performance and be "game ready". Each project requires a different approach and production pipeline and that is why the plugin got modified as we faced different challenges and technical issues, mainly related to performance issues once deployed in Decentraland. #00 - Scratching the main concepts for a transport system
As soon as we started defining on paper all the work that had to be done we set the environment to be a megalitic structure with an elevator to be accessed from the ground level. The train direction returning issue was solved by having two wagons going in the opposite direction of each other in order to avoid long waiting queues. This created a visual and design problem, we needed to design 4 platforms per level and these levels to be connected as well. So the user could easily go through the whole building. I made a visual mood-board and pitched it in order to get my hands on the first designs. For the general art style I got a heavy inspiration from the Bioshock* environments and art design highlights, and from Fallout 4 I took the transit concept. Both games take a heavy influence on retro-futurism but being backed by different art styles. Bioshock has a gorgeous and well defined art-deco environments mixed with iron forged monumentalism environments and on the other hand we have Fallout 4**, which has a well built and detailed-retro futurist world based on how the future was being dreamt in the late 50s and early 60s. Bioshock does a materfully use of the metallic channel on its environment and that was key for me on the idea of doing a similar approach on an art deco environment. Once the art boundaries were set, we could begin the work. We will do the breakdown as we created the assets, beginning with the first version of the train, the one who goes on top of the trail; followed by the design of the station and its integration with the environment. And last but not least we will take a look on the second train. *Bioshock, developed by 2K Boston / Irrational Games and published by Take Two. **Fallout 4, developed by Bethesda Game Studios and published by Bethesda Softworks. #01 The train: Shaping the virtual wagon For a 55 LAND State the Scene Limitations were pretty high for a environment that was basically a train system so we decided to go for a high-polygon mesh level of detail instead of a more blocky low-res shape resolution. The limits were a maximum of 550k tris, 116 materials and 58 textures (512 square max) to be implemented along the scene. The whole design turned around one single image that fitted perfectly the mood we were aiming for, although it backfired during development as its a hand-drawn forced perspective of the future from the 50s. As the design advanced, the main issues turned around the position of the wheel (as it deformed the main structure) and how the train would "move" along the train track. This lead to a better and smoother shaping of the wheel cover and a bigger track for a bigger wheel. From the inside point of view, which it was made up entirely from design interior concepts from the 50s and the use of wood in contrast of an iron structured wagon, the main issue was to give a "direction" to the train, as it has to have a control point or something similar stuffed with mechanical levels and buttons. Its Material design consisted on two materials, one for the exterior and one for the interior props, plus one exclusive emissive material for the control panel. Once again, the "lack" of content as the LAND was purely a way of transport meant an advantage to dedicate more resources to detail and patch with more materials the constrain of 512px textures. After a few iterations we had our first model running on the track and ready to have its firsts tests. #02 The Station: Balance between composition and utility As we said before, the station had to have two levels of platforms, one placed at 16m with connections along both sides of the LAND and another platforms placed on the 32m level. All the platforms had to be connected one to another in order to be fully playable and easy to turn in the opposite direction in case you missed a stop, just like a normal subway design. Furthermore, from an artistic point of view, the idea was to avoid as much as posible the use of stairs or long paths in order to match a more "mechanic" and futuristic view of what transport would look like. Taking the Bioshock environments and concept art as a main guideline in colour and material composition I started to sketch the main shape of the station. I started defining the design of the whole elevator, based on how Bioshock portrayed art-deco steampunk elevators I decided to follow a similar approach from scratch to the final model visuals. The design came to be open and wall-less in order to avoid a claustrophobic feeling, it also served as a concept in model detail and material design. From the very start I wanted to make a mechanical opening and closing elevator behaviour and so this made me keep in mind where the pieces pivots need to be placed and how the parenting got to be done in order to get correctly animated. Once the elevator was done and placed, the carcass was placed and its access holes designed. The platforms began to take shape. We began the development of the statio platforms by its playable design, for me it was crucial to first design how the station would be played and experienced by the user. So I made quick greyboxes doing the playable boundaries and anticipating future visual and experience design troubles, that's how we found and dealt with the troubling connection of ground with the 16m level, as well as how we started to spot complications with the visual integration of the whole set. Following the original idea, the concept was to take the user from the 16m level to the 32m level by an elevator placed above the upper platform. This lead to notice heavy problems with visual integration and gameplay utility and was quickly discarded as it overloaded the scene with an amount of avoidable tris for a short experience. Instead a -middle level- was created that connected the upper platform of the 16m level with the lower platform of the 32m level. With its final touches it came the time to paint and design its materials. I decided to use seamless tileable textures for the biggest objects as it would give me more control of sharp detail, we had the exterior structure. For the platforms and elevator I made their UVs and packed them in an atlas, this maximised control over detail and enhance graphic results. Also we made a clever use of the metallness/smoothness channel to make the environment shine naturally. #03 The Second Train: Reconverting the same concept When the stations where set, running and the overall was working, it was the time to incorporate a new train to the tracks. This train design was planned to be upside down using the same track as the original wagon but with obvious appearance modifications. The principal constrain when remodelling the exterior was to keep and preserve the uvs or reshaping the train without needing to redo the material. Because both trains use the same materials. #04 Material consumption and asset optimziation The trains were done and set, the stations placed and the first tests showed good results, because for this LAND project we decided to use a prefab approach and A. Picazo, our programmer, suggested and implemented some modifications to the plugin to recognize the same 3D models and instantiate them instead of exporting them individually as separated files. The overall performance was boosted and it was now time for a texture cut, not because we really needed it, but its always a good idea to revisit the work and improve it deleting or replacing irrelevant files. As I started to dig in the relation between texture usage and the final result I concluded that the Normal map was usually not necessary to achieve a good result. This was because the ambient light in Decentraland KILLS this kind of micro-details and the directional light is not really helpful in such conditions. So normal maps were eliminated in every material that did not simulate high bumps. I must say, that one thing that really helped the graphical level we accomplished in this scene was the use of the metallic/smoothness channel, as it meant a discrete type of shinning without being visually invasive as it is the glow channel. ORM Textures and Decentraland Decentraland recommends texture optimization by using ORM (Occlusion, Roughness, Metallness) RGB textures. This is quite a good point when working in a PBR workflow but for the project we avoided its use as Ambien Occlusion requires a specific prop-set composition in order to be truly useful. Furthermore if I needed a darker area of occlusion I would just do a light multiply over the Albedo channel instead. More info about this textures can be found in the Khronos Group documentation: Creating Colliders Colliders in decentraland are created by overlapping a mesh on the model you want with collision behaviour and writing the suffix _collider to the mesh name. It is important to not have the same name twice in the same hierarchy or have the parent and child with the same naming as the GTLF export would crash. Parenting and naming order is a must. On the performance side I highly recommend to use a low-res mesh when creating the collider as Decentraland creates Mesh Colliders based on the mesh you had named with the suffix. As you may know if you are familiar with Unity, Mesh Colliders are not quite the best workaround for complex scenes so its quite better to avoid colliders with high detail or matching the original objects and do their boundaries intead. Basic issues of a Unity workflow Decentraland runs a modified version of the Unity engine with high modifications focused on their current and planned features on the platform. This is quite great as you can use the plugin and Unity to develop and preview how it will look once deployed. Alhough there are significant visual differences because of the Ambient and Directional light on deploy, you can pretty much guess how it will look like. But although the efficience boost that means working with the unity editor there are two main constrains to keep in mind. The major part of the components will not get exported with the GTLF format and therefore will not be shown in deploy: Particle Systems, Lights, Cameras, 2D components, Collider components and VFX will not work. GTLF only gets to have the basic mesh renderer, material shading and basic Animator functionality. Note that the X axis in Unity is flipped and can lead to missplacements when working with the plugin, as DCL does not have its axis inverted. X = -X Furthermore the exporter doesnt get along with large scenes and can lead to a laggy editor. The recommendable when working with large scenes is to have the DCL exporter window hidden while editing and opening it to evaluate all the entities and keep in mind if you are going out of bounds. #05 Backgrounds As soon as the main stations where placed and the it was functional. It was time to develop the ground surroundings. I decided to do an arid vegetation-less approach because I wanted to avoid a polygon overload and maximize detail above where the experience of the train was, not below. This was the decided approach, the rockish environment was detailed with some resting areas and pipes decorating the paths. The resting areas reused the textures from the props in the station and there were created 3 new materials for the dirt and rocks and one for the glass structure. #06 Final Patches During the very end of the development and with the Decentraland launch ahead KnownOrigin became the art host for the crypto art we wanted to display. A limited number of art pieces were curated and placed along the trail, being able to be seen and admired while you travel from one point to another and wait for the train. #07 Conclusion This environment meant a huge challenge for the team, as it needed to develop a custom behaviour for the train and its stops, all the props for achieving the train to move go to A.Picazo. For me, who I was in charge of the whole environment, meant a lot as I could bring to life a truly great design based on two games and an art-style I love. Furthermore there were low constrains regarding graphics as they were reused without boring the composition, this gave me the freedom to enhance the appearance by polygons and make a difference by doing a realistic approach with the material design and give extra detail in a platform that mainly relies on flat-shading and low-poly conceptualisation of environments. Kourtin environment artist I purr when you're not looking. I'm passionate about environments and all the techie stuff to make them look rad. Learning and improving everyday to be a better hooman. |
Categories
All
Archives
February 2021
|