2025유니티수업

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

버스창문 2025. 5. 8. 16:30

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해서 원본 프리팹에 전부 적용시키기 가능