0508 휴머노이드 애니메이션(애니메이션 정상 작동 시키기 포함) , C# 클래스 상속

Apply Root Motion
체크시 좌표가 애니메이션대로 결정됨
스크립트로 움직여야해서 체크 해제

캐릭터 컨트롤러 부착

저 부분을 누르면

구워진 땅에 파란색이 빠짐

애니메이션 쪽 가서 다 체크
Apply누르고 재생해보면

점프하면 공중으로 정상적으로 올라감

빙글빙글 도는것도 정상적으로 돌아감
loop time끄고
bake~~ 전부 체크하고
original
feet
center of mass로 선택하면
애니메이션이 정상 작동함
if (Input.GetMouseButtonDown(1))
{
if (Time.time - Interval > 0.2f)
{
Moving(3);
this.Interval = Time.time;
}
else
{
Moving(6);
this.Interval = Time.time;
}
}
더블클릭 만들때 움직인 다음 interval에 현재시간 넣어야 멀쩡히 돌아감
_________________________________________________________________________________________
클래스 상속
상속을 하는 이유 : 1. 코드의 재활용
2. 기존 프로젝트가 있었는데 확장이 되거나 늘어나는 경우(냉장고에서 더 비싼 냉장고)
class Bass
{
protected string Name;
public Bass(string Name)
{
this.Name = Name;
Console.WriteLine(Name);
}
~Bass()
{
Console.WriteLine("소멸");
}
public void BassMethod()
{
Console.WriteLine("함수" + Name);
}
}
class Derived : Bass
{
public Derived(string Name) : base(Name)
{
Console.WriteLine($"{Name}.Derived");
}
~Derived()
{
Console.WriteLine("상속 소멸");
}
public void DerivedMethod()
{
Console.WriteLine("상속 함수");
}
}

상속 되게 하기 싫을때 : 클래스 이름 앞에 sealed
sealed class Bass
{
protected string Name;
public Bass(string Name)
{
this.Name = Name;
Console.WriteLine(Name);
}
~Bass()
{
Console.WriteLine("소멸");
}
public void BassMethod()
{
Console.WriteLine("함수" + Name);
}
}

protected를 걸어도 상속된 애가 안에서 쓸때나 public이지 그거 밖에서 쓰려하면 안됨
private static void A4()
{
Mammal mammal_1 = new Dog("꼬미", 3);
Dog dog;
if (mammal_1 is Dog)
{
dog = (Dog)mammal_1; // 다운 캐스팅
dog.Bark();
}
}
is : bool변수 , 맞는지 안맞는지 판단
Mammal이기에 Dog로 다운캐스팅이 가능
Mammal mammal_2 = new Cat("야옹", 4);
Cat cat = mammal_2 as Cat; //as연산자 다운캐스팅 참조형
as 연산자로 다운캐스팅
Cat cat2 = mammal_1 as Cat;
if (cat2 != null)
{
cat2.Meow();
}
else
{
Console.WriteLine("???");
}
mammal_1 은 Dog임
만약 Cat이 아닌걸 as로 다운캐스팅 시도하면 그냥 null이 들어감
___________________________________________________________
다형성 : 이름은 같지만, 하는 일은 다르다.
enemy라는 class가 attack()을 갖고있음
zombie와 monster가 둘다 enemy를 상속했으면 둘다 attack을 갖고있음
하지만 둘이 attack하는 방식은 다르다. -> 다형성
internal class ArmorSuit
{
//자식 클래스에게 메서드를 물려줄 때 virtual을 사용한다.
public virtual void Initialize()
{
}
}
virtual : 메서드를 물려주는 용도
internal class ArmorSuit
{
//자식 클래스에게 메서드를 물려줄 때 virtual을 사용한다.
public virtual void Initialize()
{
Console.WriteLine("Armored");
}
}
class IronMan : ArmorSuit
{
public override void Initialize()
{
base.Initialize();
Console.WriteLine("Missile");
}
}
override : virtual해놓은걸 물려받는 용도
internal class ArmorSuit
{
//자식 클래스에게 메서드를 물려줄 때 virtual을 사용한다.
public virtual void Initialize()
{
Console.WriteLine("Armored");
}
}
class IronMan : ArmorSuit
{
public override void Initialize()
{
base.Initialize();
Console.WriteLine("Missile");
}
}
class WarMachine : ArmorSuit
{
public override void Initialize()
{
Console.WriteLine("machine gun");
}
}
IronMan ironMan = new IronMan();
ironMan.Initialize();
WarMachine warMachine = new WarMachine();
warMachine.Initialize();
//결과
Armored
Missile
machine gun
상속받으면서 base.Initail ~~ 추가 안해두면 부모쪽에 있는걸 실행 안함
____________________________________________
메서드 숨기기 : 부모클래스의 메서드를 숨기고싶을때
class Method_Hide
{
public void Method()
{
Console.WriteLine("My Method_Hide");
}
}
class Derived2 : Method_Hide
{
public new void Method()
{
Console.WriteLine("Derived Method");
}
}
new 키워드를 이용

new를 안치면 자동으로 new가 있는걸로 취급은 해주지만 밑줄쳐짐
Method_Hide method_Hide = new Method_Hide();
method_Hide.Method();
Derived2 derived2 = new Derived2();
derived2.Method();
Method_Hide method_Hide2 = new Derived2();
derived2.Method();
____________________________________________________
결과
My Method_Hide
Derived Method
Derived Method
부모 클래스를 선언하고 안에 자식 클래스를 넣고 Method를 호출하면 자식걸로 나옴
_____________________________________________________________________________

프리팹에 변화가 생겼을때 override해서 원본 프리팹에 전부 적용시키기 가능