
In this video (objectives)…
Welcome to the course, lets get started.
In this video (objectives)…
We're using Unity 2021.1 and Visual Studio Code in this course. Let's download and install them.
In this video (objectives)…
For those new to Unity we'll take a quick tour around the interface and create a fun little pretend platformer scene.
In this video (objectives)…
We need tell Unity to use our preferred code editor and for those of us using VS Code, we'll be adding the required extensions. We'll write our first code using Debug.Log() to print to the console.
In this video (objectives)…
Lucy invites you to join us in our various community support forums in order to ask questions, connect with other students and share your progress.
In this video (objectives)…
Any time we change our project during a lecture we will commit that change to a public source control repository for students to access. In this video we show you how to access that content.
In this video (objectives)…
We overview what we'll be covering in this section of the course.
In this video (objectives)…
Let's look at the specific game mechanics and design we'll be implementing for this game.
In this video (objectives)…
In this lecture we introduce methods and take some time to understand the difference between the Start() and Update() callbacks.
In this video (objectives)…
In addition to rotating our object we want to move it forwards. We'll do this by using Tranform.Translate().
In this video (objectives)…
Variables are a critical aspect to any code so in this lecture we'll discuss how to use variables and specifically how to type them in C#.
In this video (objectives)…
To make our game easier to tweak and tune we can add SerializeField as an attribute to make our variables visible in the Unity Inspector.
In this video (objectives)…
Its time to make our vehicle respond to player input. We'll quickly set up the inputs using the "old" input system.
In this video (objectives)…
Currently our game will work differently on everyone's computer because its not framerate independent. We use Time.deltaTime to make our car drive in the same manner on all computers.
In this video (objectives)…
To change our game from basic images moving around to objects which can bump into each other we need to understand Colliders and Rigid Bodies.
In this video (objectives)…
When we bump into things we can make other things happen in our code using OnCollisionEnter2D().
In this video (objectives)…
If we want to make things happen in our game when we pass through an area or through another object we can use OnTriggerEnter2D().
In this video (objectives)…
We bring in some simple car game images into our game and play around with the pixels per unit settings to make sure our objects are the right size.
In this video (objectives)…
Let's make our level a bit more interesting by creating a simple level layout using our assets.
In this video (objectives)…
In this lecture we create a simple follow camera by telling the camera to use the same position as the player's car. We also need to add an offset so that camera is not right on top of the car by creating a new Vector3 value.
In this video (objectives)…
We need a way of doing something only if we collide with our package trigger and only if we collide with our customer trigger. The tools we'll be using will be if statements and tags and also take a first look at the == operator.
In this video (objectives)…
Bools are very helpful, especially when combined with if statements. We create our first bools to make sure we can only deliver a package if we've first picked on up.
In this video (objectives)…
After we pick up a package we want it to disappear, so we're going to use the Destroy() method to remove our package game objects after we've collided with them.
In this video (objectives)…
To give the player feedback regarding whether they have the package or not we'll change the color of our vehicle by modifying the Sprite Renderer component. To do this we'll learn how to use GetComponent.
In this video (objectives)…
In this lecture we wrap up our functionality by adding a boost pad we can drive over and a condition where bumping into obstacles will slow the vehicle.
In this video (objectives)…
We're done with this section - we've created a fun little driving game and learned some of the fundamentals of C# programming.
In this video (objectives)…
In this section we'll be using sprite shapes, effectors, particle effects and more.
In this video (objectives)…
Its good to start with the design and technical requirements for a project and that is precisely what we'll do in this lecture.
In this video (objectives)…
To create a free-flowing organic level in our game we can use Unity Sprite Shapes. In this lecture we create a Closed Sprite Shape and Sprite Shape profile as well as import a basic set of assets we can use in our project.
In this video (objectives)…
Edge Colliders are intended to follow a shape exactly which makes them the perfect way for us to keep objects on our track.
In this video (objectives)…
Cinemachine is a powerful package that allows us to create virtual cameras. In this lecture we'll create a follow camera using Cinemachine.
In this video (objectives)…
Instead of a ball rolling around we want a snow boarder to be sliding around our level, so in this lecture we'll set our 'Barry' our brave snow boarder.
In this video (objectives)…
Surface Effectors act like a conveyor belt and are a quick an easy way to move our character along the path.
In this video (objectives)…
We can spin our character in a few different ways, but the best is going to be by using the AddTorque() method to apply rotational force to the game object.
In this video (objectives)…
We need a win condition and lose condition so in this lecture we'll create a finish line and crash detection.
In this video (objectives)…
To restart the game we'll use SceneManager.LoadScene(). To access this we need to use the SceneManagement name space, so we'll be discussing how namespaces work.
In this video (objectives)…
Our level loads immediately upon the collision event, however we want a short delay. To do that we'll use Invoke().
In this video (objectives)…
Particle systems can add a lot of polish to our game, so we're going to experiment with creating a couple of cool particle effects.
In this video (objectives)…
We'll add code to our scripts so that we can play our particle effects at the right time.
In this video (objectives)…
It's time to tweak our game to make it more playable and look a bit better.
In this video (objectives)…
FindObjetOfType is another approach we can use to set a reference to a component or object.
In this video (objectives)…
We add some dust particles to our snow board and turn them on and off depending on whether or not we are touching the ground.
In this video (objectives)…
We add 2 sound effects to our game and look at 2 slightly different ways of playing clips.
In this video (objectives)…
Public methods can be accessed from other classes. In this lecture we use a public method to stop the player being able to control their character.
In this video (objectives)…
We have a minor issue that the player can bounce and trigger multiple SFX and particle effects when crashing. We'll set ourselves a challenge to stop that.
In this video (objectives)…
We wrap up this section and get ready for the next one.
In this video (objectives)…
Check out what we'll be making in this section of the course!
In this video (objectives)…
Lets begin where every game should - with the game design document - and understand the features and mechanics that we'll need for our quiz game.
In this video (objectives)…
The first step towards building our game is to add a UI canvas and background image.
In this video (objectives)…
UI text comes in many different styles. Let's add the game title and make a home for the question text.
In this video (objectives)…
Buttons will allow the player to interact with our game. Let's add some to our canvas and organize them with using a layout group
In this video (objectives)…
Scriptable object are a great way to store data, so let's use them to store our question data.
In this video (objectives)…
Give your private variables read-only access using a getter method.
In this video (objectives)…
A question is nothing without an answer, so let's look at how to store our quiz answers efficiently by using an array.
In this video (objectives)…
It's time connect our scriptable objects to our UI. Let's start by learning how to set the text field of the TextMeshPro component in code, using TextMeshProUGUI.
In this video (objectives)…
It's time connect our scriptable objects to our UI. However, before we can connect our answers to the buttons, we're going to need to learn about for loops.
In this video (objectives)…
Once the player has selected an answer, it would be nice to tell them if they got it right. To do this, we're going to swap the sprite for the button holding the correct answer and replace the question text with a confirmation message.
In this video (objectives)…
After the player has selected an answer, they can continue to click on the other answer buttons. Let's put a stop to that by changing the interactable state of the button.
In this video (objectives)…
To move the player on to the next question, we're going to implement a turn-based style timer - giving the player a fixed amount of time to answer the question and a fixed amount of time to review the answers.
In this video (objectives)…
Let’s finish up our timer by calculating the fill amount for our timer image component and add some additional functionality that our Quiz.cs script will use later on.
In this video (objectives)…
With our timer logic set up, let's connect it to our game and finally see it in action!
In this video (objectives)…
It's finally time to add some more questions to the game! We could use an array to store them, but let's use the more flexible 'List' instead.
In this video (objectives)…
There are many different types of scoring system in games but they all serve a similar purpose - to show the player how well they're doing. For our game, let's look at showing the player how many questions they got right as a percentage.
In this video (objectives)…
We use a UI slider to act as a progress bar, to show the player how far they are through the quiz.
In this video (objectives)…
Test your knowledge by creating a new canvas that will display the player's final score once the quiz is complete.
In this video (objectives)…
Our game is almost finished! We just need a way to; transition between our quiz and end screens, and reload the game if the player wants to play again. We will also fix a few minor bugs by learning about the Awake() method.
In this video (objectives)…
Our UI focused quiz game is now complete! Along the way, we learn how to; store data using scriptable objects, loop through lists and arrays using a for-loop, and reload our scenes so the player can try again without having to reload the game.
In this video (objectives)…
In this section we'll be using Tilemap to create a 2D sidescrolling platformer.
In this video (objectives)…
We look at the core design for this project and outline what features we need for our minimum viable product.
In this video (objectives)…
We've brought some sprite sheets into Unity, we now need to slice them up for our use.
In this video (objectives)…
Tilemap is a powerful tool for creating 2D games. In this lecture we understand the main aspects of Tilemap and get started using it.
In this video (objectives)…
Our level is going to have many layers to it - platforms, background, water, pickups, etc. In this lecture we look at how to create multiplayer layers using Tilemap and sorting layers.
In this video (objectives)…
Unity Rule tiles are a powerful way for us to paint a tileset and have them automatically recognise edges, corners, and other elements and display the correct art asset. This involves setting up the logic, or rules, for our rule tile.
In this video (objectives)…
We use 4 of the sprites from our spritesheet to create an idle animation for our player. This involves setting up an animator controller and creating an anim file.
In this video (objectives)…
We implement our running and climbing states and add the appropriate animations for each. We set up parameters that can be used as conditions to transition from one state to another.
In this video (objectives)…
We play around with prefabs and learn the basics of how they work.
In this video (objectives)…
We add collision for our player and for our platforms. To do this we'll need to use a composite collider and a tilemap collider.
In this video (objectives)…
We'll set up our input system using the Messages option and add an additional input action with key bindings.
In this video (objectives)…
Now that we have the basic input system being received we need to turn that into player movement by adding velocity to the player's Rigidbody.
In this video (objectives)…
We flip our player sprite by looking at our velocity and seeing what direction we are running in. This will involve using Mathf.Abs, Mathf.Sign and Mathf.Epsilon
In this video (objectives)…
We change the state of our animation with the animator control based upon whether the player is moving the player and it therefore has velocity.
In this video (objectives)…
We'll create our OnJump() method which can be called when our Jump action button is pressed, resulting in our player jumping. We'll also play with gravity and movement speed to get the tuning as we'd like.
In this video (objectives)…
To remove the issue of our player being able to spam the jump button and fly way off the screen we need to check if they are touching the ground by using Collider2D.IsTouchingLayers().
In this video (objectives)…
We need to check if the player is touching a ladder and create code to allow vertical movement in that moment.
In this video (objectives)…
Our player slowly drifts down to earth while on the ladder. Instead of this behaviour we want the player to stay where they are and not slide.
In this video (objectives)…
When our player is running up or down the ladder we want to play our climb animation.
In this video (objectives)…
Let's set up a follow camera with some dampening to soften our jump. We'll use a Cinemachine virtual camera to do this.
In this video (objectives)…
We set up a way to limit how far a camera can travel using the Cinemachine Confiner Extension.
In this video (objectives)…
Cinemachine makes life super easy for us to transition between different cameras based upon our animation state. We set up a few cameras that will blend from one to another based upon our actions.
In this video (objectives)…
We'll change the friction and bounciness of two Physics Material 2D materials so that we can create bouncy mushrooms and so we can stop the player sticking to the wall.
In this video (objectives)…
We set up a feet collider and use that to check if the player is able to jump.
In this video (objectives)…
We add all of the components and base animation to get our enemy ready for movement.
In this video (objectives)…
We give our character a reverse periscope(TM) and use OnTriggerExit2D() to let it know that its time to turn around and move the other direction.
In this video (objectives)…
We start our player death functionality by stopping the player from being able to move after the collide with an enemy.
In this video (objectives)…
We continue with our player death functionality by changing the animation and triggering a death reaction when colliding with the enemy.
In this video (objectives)…
Creating hazards requires a new tilemap with rules for what happens to the player when colliding with anything on that layer.
In this video (objectives)…
The first part of shooting is to simply instantiate a bullet from the player's gun.
In this video (objectives)…
We make our bullet fly across the screen, kill the enemy and destroy itself after colliding with anything.
In this video (objectives)…
We need some levels for upcoming lectures where we'll be loading from one level to the next.
In this video (objectives)…
When we reach the end of a level we want to teleport to the next level (ie. load a new scene).
In this video (objectives)…
We use a singleton pattern to ensure that certain things persist from one scene to the next.
In this video (objectives)…
We add a coin in our game with some animation and have the player "pick it up" by destroying the game object when the player touches it.
In this video (objectives)…
Let's make our coin pickup play some SFX when we pick it up.
In this video (objectives)…
We add lives and score to our game session script so that we can have them persist when the player dies.
In this video (objectives)…
The last "remembering when die" thing we need to work on is making sure that our coins remember being collected.
In this video (objectives)…
Prefab variants are a useful way for us to create variety for the player.
In this video (objectives)…
There is plenty more we could add to this section, but we're done for now.
In this video (objectives)…
Take a look at what we'll be making in this section of the course!
In this video (objectives)…
It's time to create our game design document! Let's look at the game mechanics and features that we'll be implementing for this game.
In this video (objectives)…
Let's take a moment to set up our project, re-organize the editor, and import all the packages and assets that we need for our game.
In this video (objectives)…
Let's get familiar with the new Unity input system and get our player moving around on screen.
In this video (objectives)…
We need to clamp the player movement, so that they can't fly off screen. To do this we need to understanding the viewport.
In this video (objectives)…
Implementing our enemies will involve multiple scripts talking to each other. Let's look at how this is going to work and start create the wave config data to store our enemy paths.
In this video (objectives)…
With our WaveConfigSO scriptable object started, we can look at making our enemy follow the stored path.
In this video (objectives)…
With existing enemies now moving along our path and be destroyed at the end, let's start instantiating new enemies at runtime.
In this video (objectives)…
We can now spawn enemies into our world but they all arrive at the same time. However, we can delay their arrival by using a coroutine.
In this video (objectives)…
Unlike for-loops, while loops don't always run for a fixed number of iterations. Let's create an infinite number of enemy waves!
In this video (objectives)…
To make our game fun we need a way for the player to get hurt. So let's add a health and damage system.
In this video (objectives)…
Before we start generating projectiles at run time, let's do a bit of prep work to get things ready and save ourselves some future headaches!
In this video (objectives)…
We create a shooting mechanic that is adaptable enough to be used by both the player and the enemy. To start with, we'll just get our player shooting.
In this video (objectives)…
We modify our current shooter script, so that the same code can be be used by the enemies.
In this video (objectives)…
Our core gameplay now works but the game itself is not very exciting. To help sell the experience we're first going to add some explosions with a particle system!
In this video (objectives)…
Screen shake can really help sell an impact but it is something we should use sparingly. We will use it as a warning, to let the player know when they have received damage.
In this video (objectives)…
We continue to add polish to our game by making a parallax scrolling background.
In this video (objectives)…
It's time to add some sound effects to our game, so let's look at how we can play audio clips at runtime.
In this video (objectives)…
With our sound effects working, now let's add some background music and understand how Unity actually handles audio.
In this video (objectives)…
Before we work on our UI, let's create a scoring system for our game.
In this video (objectives)…
Our level is almost complete but it's missing one important piece - the UI. Let's add a simple UI to display the player's health and score.
In this video (objectives)…
With our UI design sorted, it's time to hook things up so that the UI updates at runtime.
In this video (objectives)…
Our core gameplay is finished but the game never really ends. So let's add a main menu and end screen to our game.
In this video (objectives)…
We look at the Unity build order, the scene management system, and start transitioning between the scenes in our game!
In this video (objectives)…
It would be nice if our music could ignore the scene transitions and play continuously. We can do this by implementing a version of the singleton pattern.
In this video (objectives)…
We solve the final technical issue with our game, which is to display the score on the game over screen.
In this video (objectives)…
With our core gameplay finished it's time to balance the final gameplay experience and build our final project so others can play it.
In this video (objectives)…
Congratulations on completing your arcade shooter game. Along the way we learnt about; scriptable objects, instantiating objects at runtime, while loops, coroutines, adding particle effects, playing audio, and how to use the singleton pattern
Congratulations on completing the course, that's no mean feat! So what now?
If you'd like more Unity practice then check out the Complete Unity Developer 2.0 course.
Build on your knowledge with more intermediate content, then head over to our Unity RPG course (now being remastered in the latest Unity version).
Or, if you're looking to learn a new C family language then our Unreal Engine Developer course in C++ could be for you.
Look forward to seeing you there soon.
Thank you to all the amazing people who backed us during our Kickstarter!
기초부터 배우는 C# Unity 2D 게임 개발!
프로젝트 중심의 강의 진행!
코딩과 게임 디자인 원리를 모두 배우는 강의!
C# Unity 게임 개발자 2D 강의를 선택해야 하는 이유
킥스타터의 인기 강의로 시작해, 현재 유데미에서 가장 인기 있고 가장 많이 시청한 Unity 게임 개발 강의입니다. 해당 강의는 한국어 자막으로 준비하였습니다.
세계 최고의 무료 게임 개발 도구인 Unity를 사용해 비디오 게임을 만드는 방법에 대해 알아보세요. 기초부터 다루기 때문에 Unity나 코딩에 대한 사전 지식이 없어도 됩니다. 온라인 튜토리얼로 강의를 처음 시작하는 순간부터 놀라운 성과를 얻게 될 겁니다.
3D 게임을 선호하시나요? 비슷한 강의인 C# 유니티 게임 개발자 3D를 확인해 보세요. 유니티를 어느 정도 알고 있어 심화된 강의를 원하신다면 RPG 코어 컴뱃 크리에이터를 확인해 보세요. 3D 모델을 만드는 법을 처음부터 배우고 싶으세요? 블렌더 크리에이터 강의부터 시작해 보세요. 초록색 잎 로고는 열정과 품질을 상징합니다.
강의 전체 또는 개별 강의에 대한 주제에 대해 토론할 수 있는 강의 포럼에 액세스할 수 있습니다. 페이스북(약 20k), TA 커뮤니티(일 17k 뷰) 및 학생 채팅 그룹(동시접속 10k) 등 개발자 커뮤니티에 접속해 리뷰를 확인해 보세요.
이 강의는 C#과 유니티를 배울 수 있는 가장 좋은 방법인 프로젝트 중심으로 진행됩니다. 여러분은 단지 프로그래밍 개념을 배우는 것이 아니라 실제 게임에 적용해 볼 겁니다. 추가 자료와 모든 프로젝트 파일 - 비디오, 다이어그램, 스크린캐스트 등이 포함되어 있습니다.
C# Unity 게임 개발자 2D 강의는 이렇게 진행됩니다.
다음과 같은 여러 가지 게임을 만들어보세요.
스노우 보더: 유니티의 스프라이트 셰이프 도구를 이용한 간단한 측면 스크롤 점프 게임
레이저 디펜더: 적을 쏘고 피하는 하향식 스페이스 슈터
타일바니아: 유니티의 타일맵 도구를 사용하는 빠른 속도의 클래식한 사이드 스크롤 플랫폼
퀴즈 마스터: 유니티의 사용자 인터페이스를 설정하는 퀴즈 게임
또한, 다른 유니티 강의들보다 더 좋은, 더 많은 내용을 포함합니다. 아래에서 강의 길이와 리뷰를 확인해 보세요.
각 데모 게임은 다음과 같은 프로세스를 거칩니다 :
전체 게임을 직접 구축해보기
단계별 게임 구축 방법
응용 및 게임 다시 구축해보기
이 강의는 다음 내용을 포함하지 않습니다.
이 강의는 이미 매우 많은 내용을 다루지만 제한된 시간으로 인해 아래 내용은 포함하지 않습니다:
퍼포먼스 최적화
에디터 플러그인 및 수정
물리 엔진 수정
이 강의는 Unity에서 2021년 1월 리마스터링 되었습니다.
게임 개발 방법을 배우고 싶은 사람에게 유니티는 고품질의 게임을 만들 수 있는 환상적인 플랫폼입니다. 심지어 하나의 소스로 윈도우, 맥OS, iOS, 안드로이드 및 웹용 게임을 만들 수 있습니다!
초보자는 필요한 코딩과 게임 디자인 원리를 모두 배울 수 있습니다. 아티스트는 여러분의 에셋을 활용할 수 있을 겁니다. 프로그래머는 게임 디자인 원리를 배울 수 있습니다.
강의를 들으시고 강의와 관련하여 궁금하신 점은 무엇이든 Q&A에 남기실 수 있지만, 꼭 영어로 남겨주세요. 그래야 답변을 드릴 수 있습니다 :)
지금 바로 유니티를 배워보세요, 실망하지 않으실 겁니다!
강의에서 만나요!