동구의_C# & Unity_개발일지
2024.01.31 내일배움캠프 28일차 TIL_Unity (입문, 알고리즘) 본문
최종 제출과 발표회을 마쳤다.
미구현 미동작들이 있지만 나름 만족하였던 팀 프로젝트 였다.
유니티 사용에 있어 한단계 성장 할 수있는 계기가 되었고 다양하고 재미있는 게임들을 볼수 있어서 좋았다.
내일은 2월에 첫 시작으로 유니티 숙련으로 넘어간다. 지금까진 2D로 모든 게임을 만들었다면 숙련에서는 3D로 게임을 구현하는 방법을 배운다.
어떻게 보면 시작이라고 할 수있는 유니티에 3D 게임 만들기! 새로운 마음으로 열심히 시작해보자!!
알고리즘 코드카타 14일차
문자열을 정수로 바꾸기
문제 설명
문자열 s를 숫자로 변환한 결과를 반환하는 함수, solution을 완성하세요.
using System;
public class Solution {
public int solution(string s) {
return Convert.ToInt32(s);
}
}
팀 프로젝트
팀 프로젝트 발표 PPT
GIT-HUB README 작성
2D 게임 심화 개발 / 2D 게임 로직 및 상태 관리
넉백 구현
데미지 피격 구현
파티클 생성
01. 핵심 내용
1-1) 파티클 시스템(Particle System)
- 파티클 시스템은 수 천개의 작은 2D 또는 3D 오브젝트들을 관리하고, 그들의 동작과 생애를 제어합니다. 각각의 작은 오브젝트를 '파티클'이라고 부릅니다.
- 파티클 시스템의 주요 컴포넌트는 'emitter'(발사체), 'particles'(파티클), 'animator'(애니메이터), 'renderer'(렌더러) 등으로 이루어져 있습니다.
- Unity의 파티클 시스템은 시간에 따른 파티클의 행동을 시뮬레이션하며, 이를 위해 각 파티클에 대해 위치, 속도, 수명, 색상, 크기 등의 정보를 저장합니다.
- 파티클 시스템은 성능 최적화를 위해 다양한 기능을 제공합니다. 예를 들어, 시스템의 최대 파티클 수를 제한하거나, 파티클의 적용 범위를 제한하는 등의 기능이 있습니다.
1-2) 애니메이션 이벤트(Animation Events)
- 애니메이션 이벤트를 사용하면 애니메이션이 진행되는 동안 코드를 실행시킬 수 있습니다. 예를 들어, 캐릭터가 특정 동작을 할 때 사운드를 재생하거나, 특정 애니메이션 프레임에서 파티클 시스템을 발사하는 등의 작업을 할 수 있습니다.
- 애니메이션 이벤트는 Unity 애니메이션 편집기에서 설정할 수 있습니다. 편집기를 통해 애니메이션 타임라인에 이벤트를 추가하고, 해당 이벤트가 호출할 함수를 지정할 수 있습니다.
- 애니메이션 이벤트는 해당 애니메이션 클립이 재생되는 게임 오브젝트에 연결된 모든 스크립트에서 호출할 수 있는 함수를 실행할 수 있습니다.
- 이벤트는 특정 프레임에서만 실행되며, 애니메이션 상태가 변경될 때에도 자동으로 실행되지 않습니다.
- 애니메이션 이벤트를 사용하면 애니메이션과 코드의 상호작용을 더욱 유연하게 관리할 수 있습니다. 이를 통해 애니메이션의 시각적 효과와 사운드, 효과 등의 프로그래밍적 요소를 조화롭게 통합할 수 있습니다.
- 애니메이션 이벤트를 통해 호출되는 함수는 일반적으로 공용 함수(public function)이어야 하며, 매개변수가 없거나 최대 하나의 매개변수를 가질 수 있습니다.
중요한 기능들을 정리해서 알아보자!
--------------------- 생략 ---------------------
private Vector2 _knockback = Vector2.zero;
private float knockbackDuration = 0.0f;
private void FixedUpdate()
{
ApplyMovment(_movementDirection);
if(knockbackDuration > 0.0f)
{
knockbackDuration -= Time.fixedDeltaTime;
}
}
--------------------- 생략 ---------------------
public void ApplyKnockback(Transform other, float power, float duration)
{
knockbackDuration = duration;
_knockback = -(other.position - transform.position).normalized * power;
}
private void ApplyMovment(Vector2 direction)
{
direction = direction * _stats.CurrentStates.speed;
if(knockbackDuration > 0.0f)
{
direction += _knockback;
}
_rigidbody.velocity = direction;
}
몬스터를 공격하면 공격받은 몬스터를 넉백 시킬 수 있는 코드이다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DisappearOnDeath : MonoBehaviour
{
private HealthSystem _healthSystem;
private Rigidbody2D _rigidbody;
private void Start()
{
_healthSystem = GetComponent<HealthSystem>();
_rigidbody = GetComponent<Rigidbody2D>();
_healthSystem.OnDeath += OnDeath;
}
void OnDeath()
{
_rigidbody.velocity = Vector3.zero;
foreach (SpriteRenderer renderer in transform.GetComponentsInChildren<SpriteRenderer>())
{
Color color = renderer.color;
color.a = 0.3f;
renderer.color = color;
}
foreach (Behaviour component in transform.GetComponentsInChildren<Behaviour>())
{
component.enabled = false;
}
Destroy(gameObject, 2f);
}
}
위 코드를 통해 적의 몬스터를 죽일 수 있는 기능을 구현하였다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DustParticleControl : MonoBehaviour
{
[SerializeField] private bool createDustOnWalk = true;
[SerializeField] private ParticleSystem dustParticleSystem;
public void CreateDustParticles()
{
if (createDustOnWalk)
{
dustParticleSystem.Stop();
dustParticleSystem.Play();
}
}
}
걸을 때 효과를 넣었다.
public void CreateImpactParticlesAtPostion(Vector3 position, RangedAttackData attackData)
{
_impactParticleSystem.transform.position = position;
ParticleSystem.EmissionModule em = _impactParticleSystem.emission;
em.SetBurst(0, new ParticleSystem.Burst(0, Mathf.Ceil(attackData.size * 5)));
ParticleSystem.MainModule mainModule = _impactParticleSystem.main;
mainModule.startSpeedMultiplier = attackData.size * 10f;
_impactParticleSystem.Play();
}
private void DestroyProjectile(Vector3 position, bool createFx)
{
if(createFx)
{
_projectileManager.CreateImpactParticlesAtPostion(position, _attackData);
}
gameObject.SetActive(false);
}
몬스터를 공격하거나 벽에 화살이 닿으면 투사체가 나오면서 사라지는 모습을 구현하였다.