Как сделать фон в unity
Перейти к содержимому

Как сделать фон в unity

  • автор:

 

Set background images

UI Builder doesn’t have a dedicated “image” element. To create an image, do the following:

  1. Import background image into your project.
  2. Create a regular visual element A node of a visual tree that instantiates or derives from the C# VisualElement class. You can style the look, define the behaviour, and display it on screen as part of the UI. More info
    See in Glossary in UI (User Interface) Allows a user to interact with your application. Unity currently supports three UI systems. More info
    See in Glossary Builder.
  3. Set the element’s background image to the imported image.

When you set the background image, you must select a supported background image types:

  • Textures An image used when rendering a GameObject, Sprite, or UI element. Textures are often applied to the surface of a mesh to give it visual detail. More info
    See in Glossary
  • Sprites A 2D graphic objects. If you are used to working in 3D, Sprites are essentially just standard textures but there are special techniques for combining and managing sprite textures for efficiency and convenience during development. More info
    See in Glossary
  • Render textures A special type of Texture that is created and updated at runtime. To use them, first create a new Render Texture and designate one of your Cameras to render into it. Then you can use the Render Texture in a Material just like a regular Texture. More info
    See in Glossary
  • SVG Vector images

Note: To use a SVG image as a background for a visual element, you must install a package. To do so, in the Package Manager window, install the package com.unity.vectorgraphics from git URL.

Image import settings

After you have imported an image to your project, for the most intuitive results, Unity recommends you to apply certain import settings for Textures, Sprites, and Vector images before you use them as a background for a visual element in the UI Builder.

Texture

The recommended import settings for a Texture image that you use as a background for a visual element:

Property: Value:
Texture Type Default
Non-Power of 2 None
Compression A method of storing data that reduces the amount of storage space it requires. See Texture Compression, Animation Compression, Audio Compression, Build Compression.
See in Glossary
None
Alpha Is Transparency true
Texture Type Editor GUI and Legacy GUI
Non-Power of 2 None
Compression None
Alpha Is Transparency true
Texture Type Sprite (2D and UI)
Compression None
Alpha Is Transparency true
Sprite Mode Single
Mesh The main graphics primitive of Unity. Meshes make up a large part of your 3D worlds. Unity supports triangulated or Quadrangulated polygon meshes. Nurbs, Nurms, Subdiv surfaces must be converted to polygons. More info
See in Glossary Type
Tight

Sprites

The recommended import settings for a Sprite image that you use as a background for a visual element:

Property: Value:
Texture Type Sprite (2D and UI)
Compression None
Alpha Is Transparency true
Sprite Mode Multiple if file contains multiple sprites, Single otherwise
Mesh Type Tight

Vector images

The recommended import settings for a SVG Vector image that you use as a background for a visual element:

Property: Value:
Generated Asset Type UI Toolkit Vector Image
Tessellation Settings Basic
Target Resolution Lowest value that produces satisfactory results

Tip:

  • You can apply default presets to Assets by folder to automatically set your desired import settings.
  • All image types are subject to dynamic atlasing if they’re not already in an atlas. (An image is in an atlas if imported as a Sprite with Sprite Mode set to Multiple, or if you have manually added it to a Sprite Atlas A texture that is composed of several smaller textures. Also referred to as a texture atlas, image sprite, sprite sheet or packed texture. More info
    See in Glossary asset.) You can configure dynamic atlasing in a Panel Settings asset.

9-Slice images with UI Toolkit

Generally, you can only 9-slice a regular 2D Sprite. With UI Toolkit however, you can also 9-slice Texture, Render Texture, and SVG Vector images.

To 9-slice an image:

  • For a Sprite image, use Sprite Editor or USS.
  • For other types of images, use USS.

To 9-slice a selected image using USS:

  1. Open UI Builder .
  2. In the Background section in the Inspector A Unity window that displays information about the currently selected GameObject, asset or project settings, allowing you to inspect and edit the values. More info
    See in Glossary , specify the Left, Right, Top, and Bottom slice values.

You can also specify the slice values directly in USS, UXML, or C# files for the following properties:

Adding and displaying a background

Pixelnest StudioPixelnest 18 nov. 2013

Using the empty project we created in the previous part, we will now learn how to add a background and some fancy clouds.

Adding a background

Your first background will be static. We will use the following image:

TGPA background

(Right click to save the image)

Import the image in the “sprites” folder. Simply copy the file in it, or drag and drop it from the explorer.

Do not worry about the import settings for now.

In Unity, create a new Sprite game object in the scene.

New sprite

What is a sprite?

In general, we call “sprite” a 2D image displayed in a video game. Here, it’s a Unity specific object made for 2D games.

Add the texture to the sprite

We will now select the actual sprite to display. Make sure that “New Sprite” is selected and look at the inspector. Set the Sprite property to the “background” image:

Select a sprite

(You have to click on the small round icon at the right of the input box to show the “Select Sprite” inspector)

You can see that some other sprites are there. Those are the default images used by uGUI (the Unity UI system).

“My sprite doesn’t show up in the dialog?”: first, make sure you are in the “Assets” tab of the “Select Sprite” dialog.

Some readers have reported that, in their project, this dialog was empty. The reason is that for some Unity installations, even with a fresh new 2D project, images are imported as “Texture” and not “Sprite”.

To fix this, you need to select the image in the “Project” pane, and in the “Inspector”, change the “Texture Type” property to “Sprite”:

Sprite mode

We don’t know why everybody doesn’t seem to have the same behavior.

Well, we have set a simple sprite displaying a cloudy sky background. You can think it was a bit complicated just for that. In fact, we could have dragged the sprite from the “Project” tab directly right into the “Scene”.

Let’s reorganize the scene.

In the “Hierarchy” pane, select the New Sprite . Rename it in Background1 or something you will easily remember.

Then move the object to where it belongs: Level -> Background . Change its position to (0, 0, 0) .

Background is set

A quick exercise: duplicate the background and place it at (20, 0, 0) . It should fit perfectly with the first part.

Tip: you can duplicate an objet with the cmd + D (OS X) or ctrl + D (Windows) shortcuts.

Background2 in place

Sprite layers

The next statement will seem pretty obvious, but it has some consequences: we are displaying a 2D world.

This means that all images are at the same depth, ie. 0 . And you (as well as the graphics engine) don’t really know who’s going to be displayed first.

Sprite layers allow us to tell Unity what is in the front and what is in the back.

In Unity, we can change the “Z” of our elements, and this will allow us to have layers. This is actually what we were doing in this tutorial before the Unity 5 update.

But we thought that it was a good idea to use Sprite Layers.

On your “Sprite Renderer” component, you have a field named… “Sprite Layer”, currently set to Default .

If you click on it, a short list will show:

Sorting layer list

Let’s add some layers to fit our needs (use the “+” button):

Sorting layer add

Apply the Background layer to our background sprite:

Set sorting layer

Tip: the settings “Order in Layer” is a way to limit sub-layers. Sprites with lower numbers are rendered before sprites with greater numbers.

Note: the “Default” layer cannot be removed, because this is the layer used by 3D elements. You can have 3D objects in your 2D game. Particles are considered as 3D objects by Unity, so they will be rendered on this layer.

Adding background elements

Also known as props. These elements aren’t used to improve the gameplay but to visually enhance the scene.

Here are some simple flying platform sprites:

Platform sprites

 

(Right click to save the image)

As you can see, we got two platforms in one file. This is a good way to learn how to crop sprites with the Unity tools.

Getting two sprites from one image

  1. Import the image in your “sprites” folder
  2. Select the “platforms” sprite and go to the inspector
  3. Change “Sprite Mode” to “Multiple”
  4. Click on “Sprite Editor”

Multiple sprites

In the new window (“Sprite Editor”), you can draw rectangles around each platform to slice the texture into smaller parts:

Sprite Editor

Call the platforms “platform1” and “platform2”.

Tip: the top-left button “Slice” allows you to quickly and automatically make this tedious task.

Unity will find the objects inside the image and will slice them automatically. You can specify the default pivot point, or set a minimum size for a slice. For a simple image without artifacts, it’s really efficient. However, if you use this tool, be careful and check the result to be sure to get what you want.

Now, under the image file, you should see the two sprites separately:

Sprite Editor result

Adding them to the scene

We will proceed like for the background sprite: create a new Sprite and select the “platform1” sprite (or drag them one by one from the “Project” to the “Scene” tab). Repeat for “platform2”.

Set their “Sprite Layer” to “Platforms”.

Place them in the Middleground object.

Two shiny new platforms

And… it’s working! I’m still amazed how simple it is now (to be honest, it was a bit tricky without the 2D tools, involving quad and image tiling).

Prefabs

Save those platforms as prefabs. Just drag’n’drop them inside the “Prefabs” folder of the “Project” pane from the “Hierarchy”:

Prefabs

By doing so, you will create a Prefab based exactly on the original game object. You can notice that the game object that you have converted to a Prefab presents a new row of buttons just under its name:

Prefab connection

Note on the “Prefab” buttons: if you modify the game object later, you can “Apply” its changes to the Prefab or “Revert” it to the Prefab properties (canceling any change you’ve made on the game object). The “Select” button move your selection directly to the Prefab asset in the “Project” view (it will be highlighted).

Creating prefabs with the platform objects will make them easier to reuse later. Simply drag the Prefab into the scene to add a copy. Try to add another platform that way.

You are now able to add more platforms, change their positions, scales and planes.

You can put some in background or foreground too. Remember that the “Background”, “Middleground” and “Foreground” objects are just folders. So you need to set the right “Sprite Layer” (Platforms) and change the “Order in Layer”.

Use -10 for far platforms, and increase this number as you reach the foreground. An example:

Add a platform in background

It’s not very fancy but in two chapters we will add a parallax scrolling and it will suddenly bring the scene to life.

Camera and lights

Well. In the previous version of this tutorial (for Unity 4.2), we had a long and detailed explanation on how to set the camera and the lights for a 2D game.

The good news is that it’s completely useless now. You have nothing to do. It just works™.

Aside: if you click on the Main Camera game object, you can see that it has a “Projection” flag set to “Orthographic”. This is the setting that allows the camera to render a 2D game without taking the 3D into account. Keep in mind that even if you are working with 2D objects, Unity is still using its 3D engine to render the scene. The gif above shows this well.

Next step

You have just learned how to create a simple static background and how to display it properly. Then, we have taught you how to make simple sprites from an image.

In the next chapter, we will learn how to add a player and its enemies.

© 2016 Pixelnest Studio — we craft games and apps

Create a Fullscreen Background Image in Unity2D with a SpriteRenderer

A common requirement for 2D games is to have some sort of fullscreen background, be it a color, sprite, particle system, or anything else, to provide mood and aesthetic to the contents of your game. While a static color can be used to great effect, this post will go over the technique that I use for fullscreen background images in Unity using a standard SpriteRenderer and just a little touch of code to retain the original image’s aspect ratio. Maintaining the image’s aspect ratio prevents it from being stretched or squished, and it’s important due to the wide array of screen sizes available to mobile and desktop users alike.

When I originally set about to write the code for this, it took longer than I’d care to admit because I wasn’t thinking properly about how Unity handles scale. I had originally intended to maintain the aspect ratio on the scale itself using the same logic you would use to resize or crop an image, yet after writing the logic to do this I just couldn’t get the image to maintain it’s proper aspect ratio. I stared at and tweaked the math time and time again, yet the image would still be stretched. This was especially frustrating considering I was certain the math was correct, which it was, however Unity scale is not related to the actual resolution of the Sprite! Finally I realized, as I’ll show below, that Unity makes this much simpler than I had originally envisioned.

Setup

The first thing we’ll need is an actual background image. I’ll be using this image, but feel free to use whatever image you like.

Next we’ll need a GameObject, I’ll be calling mine Background, with a SpriteRenderer component. Go ahead and attach your preferred background image to the SpriteRenderer in the Sprite property, and you should have a setup like so:

Background GameObject

Unscaled background image

The only problem is, depending on the size of your image and the target device resolution, your image likely won’t fit perfectly and you’ll end up with something like the image to the right.

What we could do is set the scale of the Background to match the camera size in the editor, but you won’t have much luck running on actual devices considering the width of the Unity camera is dynamic (while the height always remains constant), and scales based on the resolution of the device you’re running on. A better solution would be to write a little code to dynamically scale the Background as needed.

All we’ll need to do is set the scale of the Background based on it’s Sprite’s size compared to the size of the Camera at runtime, and maintain the aspect ratio of the original image. As we’ll see in the code below, Unity actually makes maintaining the aspect ratio really easy for us.

The Script

What we’ll do is create a new script called FullscreenSprite, and attach it to the Background GameObject like so:

Attack new FullscreenSprite script to Background GameObject

As for the actual contents of the code, we’ll start off by simply grabbing a reference to the attached SpriteRenderer to determine the size of the sprite, as well as the size of and camera we’re working with:

As you can see, we start off by grabbing the SpriteRenderer component. Next we determine the height of the camera using the orthographicSize property, which is essentially half the camera’s height in Unity units (not pixels). By default this is 5. We determine the full cameraSize using the height we already calculated, and multiplying it by the camera’s aspect ratio to determine the width (aspect ratio = width / height). Finally, the spriteSize is simply grabbed from the SpriteRenderer’s sprite.

The next thing we’ll need to do is to determine what scale we need in order to fill the camera:

We determine if the camera is in a landscape (or equal) orientation, or portrait using the cameraSize we calculated in the previous step, and comparing it’s x (width) to it’s y (height). Based on the orientation, we multiply the current scale with either the width or height of the camera, divided by the corresponding width or height of the sprite.

For instance, if your cameraSize is 9, 5 and your spriteSize is 4, 3, we’ll be multiplying the scale by cameraSize.x / spriteSize.x = 9 / 4 = 2.25. Likewise if your camera were 5, 9 we’d multiply the scale by cameraSize.y / spriteSize.y = 9 / 3 == 3. The purpose is to scale the sprite to match the larger dimension of the camera’s size.

The resulting scale maintains the aspect ratio of the image, because Unity assigns the GameObject with a scale of 1, 1 by default, even if the image is 1000×500 pixels, for example. If an image is 1000×500 and you set the scale to 2, 2, the rendered image would be 2000×1000 — the exact same aspect ratio. We use this to our advantage because as long as we keep the X and Y scale as the same value, we don’t have to do any extra aspect ratio calculation, it’s all handled internally by Unity anyways!

The last thing we need to do is simply apply the new scale:

You’ll see I’m also setting the position to 0, 0 here. This is entirely optional, I just like to add this when appropriate to ensure that even if the Background is accidentally moved in the Unity editor, it’s set to the appropriate position at runtime.

The only thing left to do now is to run the game and see the background image in all it’s fullscreen glory:

Fullscreen Images in Unity2D

The red lines within the scene editor indicate the bounds of the camera, and as you can see, whether the game is run in landscape or portrait orientation, the image is scaled accordingly and maintains it’s aspect ratio!

And just in case anything wasn’t clear while following along, here’s the full script:

And that’s all there is to it! As I said in the intro, I wanted to write this post because as I was initially developing the logic, I wasn’t taking into account the way Unity scales sprites. I was thinking more in terms of image resizing where you need to actually calculate and use the aspect ratio when determining the width and height to scale to. Hopefully this post will be helpful to anyone making the same mistakes I was!

Unity 2D: Как нарисовать фон для игры?

      1. У вас должны быть рисунки (я использую в формате png с прозрачным фоном), из которых будете делать палитру (Tile Pallete), а из палитры фон.
      2. В окне Project создаем папку для рисунков (Sprites), кликаем на правую кнопку — Import New Asset. Рисунке в проекте, с ними дальше можно работать.
      3. Нужно создать сетку для нанесения фона (Tilemap). Переходим в меню GameObject — 2D — Tilemap. В Hierarchy появляется Grid-Tilemap.
      4. Добавляйте сколько хотите слоев, в Inspector — Tilemap Renderer установите порядок слоев:
      1. Открывайте в меню Window — 2D — Tile Pallete (если нет такого пункта, читаем здесь как добавить). Нажимаем Create New Palette. Их можно создавать сколько угодно.
      2. Далее Tile Palette остается открытым, в Project открываем папку с рисунками, которые импортировали в п. 2 и перетаскиваем в Tile Pallete самый мелкий рисунок. Этот рисунок определит масштаб для более крупных рисунков. Далее перетаскиваем остальные рисунки. Например, это может выглядеть так:Зеленая точка слева определяет масштаб. Если бы перенес в палитру сначала футбольное поле, то оно бы уместилось в одну ячейку.
      3. Далее выбираем на каком слое будем рисовать (на рисунке выше Active Tilemap).
      4. Выбираем кисточку, выделяем на Tile Pallete тот кусок, который хотим перенести на слой, и собственно рисуем.
      5. Если, например, нужно раскрасить вокруг футбольного поля все зеленым, то выбираем зеленый пиксель, выбираем прямоугольник (рядом с кисточкой) и выделяем на сцене тот участок, который должен стать зеленым. Это ускоряет раскраску. Нам достаточно выделить область вместо того, чтобы кликать на каждую ячейку.

       

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *