https://www.youtube.com/watch?v=2De-Bp262eE
방출되는 파티클의 개수를 제어한다
파티클이 방출되는 모양 설정 (Cone 기준 설명)
추가 속도 부여
시간에 따라 속도 줄이기
뭔가가 움직였다면 파티클 속도도 영향 받음
(Simulation Space가 World일 때만 작동)
Velocity over Lifetime과 비슷하지만
가속도를 기반으로 좀 더 자연스럽게 속도 증가
시간에 따라 색상 변화
파티클 속력에 따라 색상 변화
시간에 따라 크기 변화
파티클 속력에 따라 크기 변화
시간에 따라 회전 변화
파티클 속력에 따라 회전 변화
(굴러떨어지다 멈추는 것들을 파티클로 구현할 때 사용)
바람같은 외부 힘에 얼마나 영향 받을지
노이즈 맵 따라 불규칙하게 이동
벽 뚫고가지 않게 충돌 설정
(모바일에선 성능 이슈 있긴 함)
특정 영역에 들어갔을 때 파티클이 어떤 짓을 할건지
파티클이 꺼지거나 없어질 때 또 다른 파티클 생성 (폭죽 만들 때 사용)
Sprite Texture를 파티클에서 순서대로 사용할 때
Material의 Base Map에 Sprite 넣고 Particle System에 적용하면 된다
파티클 마다 Light 박는거.
실무에서 안 쓴다. 성능 이슈 있음.
파티클이 궤적을 남긴다
파티클에서 셰이더 제어
특성은 코드에 설명을 추가로 붙이는 것이다.
[Obsolete]
public class OldClass {}


특정 기호에 따라 실행 여부를 결정할 수 있다.
#define RELEASE
using System;
using System.Diagnostics;
public class ConditionalDemo
{
static void Main()
{
DebugMethod();
ReleaseMethod();
}
[Conditional("DEBUG")]
static void DebugMethod() => Console.WriteLine("디버그 환경에서만 표시");
[Conditional("RELEASE")]
static void ReleaseMethod() => Console.WriteLine("릴리스 환경에서만 표시");
}

비주얼 스튜디오 상단에 있는 드롭다운에서 프로그램에 debug와 release 기호를 제공할 수 있다.
using System.Runtime.CompilerServices;
using static System.Console;
class CallerInformation
{
static void Main()
{
TraceMessage("여기에서 무엇인가 실행...");
}
public static void TraceMessage(string message,
[CallerMemberName] string memberName = "",
[CallerFilePath] string sourceFilePath = "",
[CallerLineNumber] int sourceLineNumber = 0)
{
WriteLine("실행 내용 : " + message);
WriteLine("멤버 이름 : " + memberName);
WriteLine("실행 내용 : " + sourceFilePath);
WriteLine("실행 내용 : " + sourceLineNumber);
}
}
실행 내용 : 여기에서 무엇인가 실행...
멤버 이름 : Main
실행 내용 : C:\Users...\Project1\ConsoleApp1\Program.cs
실행 내용 : 8
using System;
public class SampleAttribute : Attribute
{
public SampleAttribute() => Console.WriteLine("사용자 지정 특성 사용됨");
}
[Sample] public class CustomAttributeTest { }
class AttributePractice
{
static void Main()
{
Attribute.GetCustomAttributes(typeof(CustomAttributeTest));
}
}
특성을 사용할 때는 다음 두 가지 방식이 모두 가능합니다:
[Sample] // 접미사 Attribute 생략
[SampleAttribute] // 완전한 이름 사용
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = true)]
public class NickNameAttribute : Attribute
{
public string Name { get; set; }
public NickNameAttribute(string name) { Name = name; }
}
reflection : 동적으로 특정 어셈블리 또는 형식에 대한 메타데이터를 Type 개체로 반환하는 것
> string r = "Reflection";
> Type t = r.GetType();
> t
Type 클래스로 문자열 개체 정보를 얻어 출력하는 리플렉션 예제
> System.Reflection.Assembly assembly = typeof(System.Random).Assembly;
> assembly
[System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85dea779]
Aseembly 클래스를 사용하여 특정 어셈블리의 정보를 얻는 예제
// Test 클래스에 대한 Type 개체 가져오기
Type t = typeof(test);
// 원하는 멤버를 조건에 따라 가져오기
MemberInfo[] members = t.GetMembers(BindingFlags.Static | BindingFlags.Public);
리플렉션을 사용하여 Test 클래스의 정적 멤버 리스트를 얻는 예제
클래스를 사용하여 새로운 형식을 정의하고,
개체는 데이터와 기능을 숨기는 캡슐화 기능을 제공한다.
클래스 : 설계도
객체 : 설계도로 조립한 물건
필드 : 클래스의 부품. 외부에 공개할 땐 public 대신 readonly와 const 필드만 허용하길 권장
생성자 : 자동차 시동 걸기. 클래스 내 필드를 초기화한다.
소멸자 : 자동차 시동 끄기. GC 엔진이 대신 해준다.
메서드 : 클래스의 기능과 동작.
속성 : 자동차의 속성, 특징, 색상, 모양 등 표현. private, public
인덱서 : 자동체 카탈로그 역할. 만든 객체를 배열 형식으로 사용할 수 있게 한다.
public class Person
{
private string name;
public void SetName(string n) => name = n;
public string GetName() => this.name;
}
public abstract class Animal
{
public abstract string Cry();
}
public class Dog : Animal
{
public override string Cry() => "멍멍멍";
}
public class Cat : Animal
{
public override string Cry() => "야옹";
}
public class Trainer
{
public void DoCry(Animal animal)
{
Console.WriteLine("{0}", animal.Cry());
}
}
using System;
using System.Collections;
// 네임스페이스 : 클래스 이름 충돌 방지
namespace CarWorld
{
// 인터페이스 : 표준, 다중 상속
interface IStandard { void Run(); }
/// <summary>
/// 클래스: 설계도
/// </summary>
class Car : IStandard
{
#region 필드
private string name;
private string[] names;
private readonly int _Length;
#endregion
#region 생성자
public Car()
{
this.name = "좋은차";
}
public Car(string name)
{
this.name = name;
}
public Car(int length)
{
this.name = "좋은차";
_Length = length;
names = new string[length];
}
#endregion
#region 메서드
public void Run() => Console.WriteLine("{0} 자동차가 달립니다.", name);
#endregion
#region 속성
public string Name
{
get { return name; }
set { name = value; }
}
public int Length { get { return _Length; } }
#endregion
#region 소멸자
~Car()
{
Console.WriteLine("{0} 자동차가 폐차됨.", name);
}
#endregion
#region 인덱서
public string this[int index]
{
get { return names[index]; }
set { names[index] = value; }
}
#endregion
#region 이터레이터
public IEnumerator GetEnumerator()
{
for (int i = 0; i < _Length; i++)
{
yield return names[i];
}
}
#endregion
#region 대리자
public delegate void EventHandler();
#endregion
#region 이벤트
public event EventHandler Click;
#endregion
#region 이벤트 처리기
public void OnClick()
{
if (Click != null)
{
Click();
}
}
#endregion
}
class CarWorld
{
static void Main()
{
Car campingCar = new Car("캠핑카");
campingCar.Run();
Car sportsCar = new Car();
sportsCar.Name = "스포츠카";
sportsCar.Run();
Car cars = new Car(2);
cars[0] = "1번 자동차";
cars[1] = "2번 자동차";
for (int i = 0; i < cars.Length; i++)
{
Console.WriteLine(cars[i]);
}
foreach (string name in cars)
{
Console.WriteLine(name);
}
Car btn = new Car("전기자동차");
btn.Click += new Car.EventHandler(btn.Run);
btn.Click += new Car.EventHandler(btn.Run);
btn.OnClick();
}
}
}