[Unity Tutorial Slime World 04] Monster Moving


1. 몬스터 슬라임에 네비게이션 추가

Slime -> Add Component -> Nav Mesh Agent


2. 네비게이션 맵 영역 설정

Window -> Navigation

Stg_Floor -> Navigation -> Bake -> Clear -> Bake


3. 플레이어 태그 생성

Player -> Tag -> Player


4. 몬스터 슬라임에 SlimeController 스크립트 생성

Slime -> Add Component -> New Script -> SlimeController 스크립트 생성


5. SlimeController 스크립트 수정


6. 몬스터 슬라임 속도 지정

Slime -> Slime Controller (Script) -> Run Speed : 1


[Unity Tutorial Slime World 03] Player Attacking and Apply Animations


1. 애니메이션 타입을 레거시에서 메카님으로 변경 (Converting Legacy to Mecanim)

cha_data -> character -> cha_knight -> Motions

-> Mot_Knight@Attack, Mot_Knight@Damage, Mot_Knight@Dead, Mot_Knight@Wait, Mot_Knight@Walk

-> Inspector -> Rig -> Animation Type -> Legacy 에서 Generic 으로 변경 후 Apply


2. 플레이어에 Animator 추가

Player -> Add Component -> Animator 생성

Player -> Animator -> Controller -> Knight Controller 추가


3. Animator 스테이트 생성

Animator -> Create State -> Empty -> Wait, Walk, Attack, Damage, Dead 5개의 스테이트 생성


4. Animator 트랜지션 생성

Make Transition 로 5개의 스테이트 연결

5. Animator 파라미터 변수 생성

Animator -> Parameters -> isRunning, isAttacking, isDamaging, isDead 생성



6. Animator 조건 추가

Transition (화살표) -> Conditions -> Parameter와 Value 추가

 State

Parameter 

Value 

 Wait -> Walk

isRunning 

true 

Walk -> Wait 

isRunning 

false 

Any State -> Attack 

isAttacking 

true 

Any State -> Damage 

isDamaging 

true 

Any State -> Dead 

isDead 

true 



7. PlayerController 스크립트 수정


- Reference

[레거시 애니메이션 시스템] https://docs.unity3d.com/kr/current/Manual/Animations.html

[애니메이션 및 메카님 용어] https://docs.unity3d.com/kr/current/Manual/AnimationGlossary.html



[Unity Tutorial Slime World 02] Player Moving And Rotating


1. Player Controller 스크립트 생성

Player -> Add Component -> New Script -> PlayerController 생성


2. Player Controller 스크립트 수정


3. 플레이어 이동 속도와 회전 속도 지정

Player -> Player Controller (Script) -> Run Speed : 2, Rotation Speed : 100 으로 변경

[Unity Tutorial SlimeWorld  01] Creating a new project and Setting up the Game


1. 에셋스토어에서 리소스 다운로드 하기

에셋스토어에서 Animated Knight and Slime Monster 다운로드 하기

https://www.assetstore.unity3d.com/kr/#!/content/24471


2. 새 씬 생성하기 (Ctrl + N)


3. 스테이지 바닥 생성하기

cha_data -> monster -> char_slime -> Models -> Stg_Floor 를 Scene에 넣기

Stg_Floor -> Transform Reset -> Scale (10, 10, 10) 으로 변경


4. 플레이어(Knight)  생성하기

cha_data -> character -> cha_knight -> models -> Cha_Knight 를 Scene에 넣기

Cha_Knight의 이름을 Player로 변경

Player -> Transform Reset


5. 적(Slime) 생성하기

cha_data -> monster -> char_slime -> Models -> Cha_Slime 을 Scene에 넣기

Cha_Slime의 이름을 Enemy로 변경

Enemy -> Transform Reset -> Position (3, 0, 0) 으로 변경


6. 카메라 세팅하기

Main Camera

Position (0, 1.8, 3)

Rotation (30, 180, 0)



[WPF ListView] Get Count of ListView and Control ListView Scroll


WPF Mouse Hooking and Display the time, mouse position as occurring a mouse left click event


- MainWindow.xaml

<Window x:Class="Macro.MainWindow"

        Title="MainWindow" Height="350" Width="525">

    <Grid>

        <ListView x:Name="lvControl" HorizontalAlignment="Left" Height="271" Margin="25,29,0,0" VerticalAlignment="Top" Width="473">

            <ListView.View>

                <GridView>

                    <GridViewColumn Header="Time" Width="100" DisplayMemberBinding="{Binding Time}"/>

                    <GridViewColumn Header="Control" Width="100" DisplayMemberBinding="{Binding Control}"/>

                    <GridViewColumn Header="Key" Width="100" DisplayMemberBinding="{Binding Key}"/>

                    <GridViewColumn Header="Event" Width="100" DisplayMemberBinding="{Binding Event}"/>

                </GridView>

            </ListView.View>

        </ListView>

    </Grid>

</Window>


- MainWindow.xaml.cs


- Result


WPF ListView Binding


- MainWindow.xaml

<Window x:Class="Macro.MainWindow"

        Title="MainWindow" Height="350" Width="525">

    <Grid>

        <ListView x:Name="lvControl" HorizontalAlignment="Left" Height="271" Margin="25,29,0,0" VerticalAlignment="Top" Width="473">

            <ListView.View>

                <GridView>

                    <GridViewColumn Header="Time" Width="100" DisplayMemberBinding="{Binding Time}"/>

                    <GridViewColumn Header="Control" Width="100" DisplayMemberBinding="{Binding Control}"/>

                    <GridViewColumn Header="Key" Width="100" DisplayMemberBinding="{Binding Key}"/>

                </GridView>

            </ListView.View>

        </ListView>

    </Grid>

</Window>


- MainWindow.xaml.cs




WPF Mouse Moving and Keyboard Input Hooking


[Unity Tutorial Roll-a-ball 08] Building the Game

1. 씬 저장하기

File -> Save Scenes (단축키 : Ctrl + S)

2. 게임 빌드하기

File -> Build Settings -> PC 선택 -> Add Open Scenes

3. 윈도우용 게임 실행 파일 생성

Builds 폴더 생성 -> Roll a Ball(Win) 이름으로 저장

4. 게임 실행

Roll a Ball(Win) 게임 파일 실행하기

Screen 에서 원하는 해상도 선택 -> Play!

게임 종료 : Alt + F4

 

-Reference

[Building the Game] https://unity3d.com/kr/learn/tutorials/projects/roll-ball-tutorial/building-game?playlist=17141

[Unity Tutorial Roll-a-ball 07] Displaying the Score and Text

1. 점수 카운트 변수 생성 및 계산

PlayerController 스크립트 수정

}

    // 에디터 안 Inspector에서 편집 가능한 속도 조정 변수 생성
    public float speed;
    // Rigidbody 형태의 변수 생성
    private Rigidbody rb;
    // 점수 카운트 변수
    private int count;

    // 스크립트가 활성화된 첫 프레임에 호출
    void Start()
    {
        // 현재 오브젝트의 Rigidbody를 참조
        rb = GetComponent<Rigidbody>();
        // 점수 초기화
        count = 0;
    }

    // 프레임을 렌더링 하기 전에 호출
    void Update()
    {

    }

    // 물리효과 계산을 수행하기 전에 호출
    void FixedUpdate()
    {
        // 키보드의 키로 컨트롤하는 수평 축의 입력 (left, right)
        float moveHorizontal = Input.GetAxis("Horizontal");
        // 키보드의 키로 컨트롤하는 수직 축의 입력 (up, down)
        float moveVertical = Input.GetAxis("Vertical");

        // 플레이어의 이동량을 선언 (x축, y축, z축)
        Vector3 movemnet = new Vector3(moveHorizontal, 0, moveVertical);
        // 플레이어의 Rigidbody에서 movement 값만큼 힘을 가해서 이동시킴
        rb.AddForce(movemnet * speed);
    }

    // 트리거 콜라이더를 처음 접촉할 때 호출
    void OnTriggerEnter(Collider other)
    {
        // 오브젝트의 태그 값 비교
        if ( other.gameObject.CompareTag("PickUp"))
        {
            // 오브젝트 비활성화
            other.gameObject.SetActive(false);
            // 점수 카운트 업
            count = count + 1;
        }       
    }

2. UI 점수 텍스트 생성

Hierarchy -> Create -> UI -> Text -> CountText로 이름 변경

CountText -> Color -> 흰색으로 색상 변경

CountText -> Rect Transform -> 설정 (톱니 바퀴) -> Reset

CountText -> Rect Transform -> custom 박스를 Shift + Alt + 마우스 우클릭 -> left, top 선택 

CountText -> Rect Transform -> Pos X : 10, Pos Y : -10 으로 변경

3. UI 승리 텍스트 생성

Hierarchy -> Create -> UI -> Text -> WinText로 이름 변경

WinText-> Color -> 흰색으로 색상 변경

WinText-> Rect Transform -> 설정 (톱니 바퀴) -> Reset ->Pos Y : 75 로 변경

WinText-> Character -> Font Size : 24 로 변경

WinText-> Paragraph -> Alignment 가운데 정렬로 변경

4. UI 점수, 승리 텍스트 초기화 및 표시

PlayerController 스크립트 수정

 // UI 엔진
using UnityEngine.UI;

public class PlayerController : MonoBehaviour {

    // 에디터 안 Inspector에서 편집 가능한 속도 조정 변수 생성
    public float speed;
    // 에디터의 UI 점수 텍스트
    public Text CountText;
    // 에디터의 UI 승리 텍스트
    public Text WinText;

    // Rigidbody 형태의 변수 생성
    private Rigidbody rb;
    // 점수 카운트 변수
    private int count;

    // 스크립트가 활성화된 첫 프레임에 호출
    void Start()
    {
        // 현재 오브젝트의 Rigidbody를 참조
        rb = GetComponent<Rigidbody>();
        // 점수 초기화
        count = 0;
        // 점수 텍스트 표시
        SetCountText();
        // 승리 텍스트 초기화
        WinText.text = "";
    }

    // 프레임을 렌더링 하기 전에 호출
    void Update()
    {

    }

    // 물리효과 계산을 수행하기 전에 호출
    void FixedUpdate()
    {
        // 키보드의 키로 컨트롤하는 수평 축의 입력 (left, right)
        float moveHorizontal = Input.GetAxis("Horizontal");
        // 키보드의 키로 컨트롤하는 수직 축의 입력 (up, down)
        float moveVertical = Input.GetAxis("Vertical");

        // 플레이어의 이동량을 선언 (x축, y축, z축)
        Vector3 movemnet = new Vector3(moveHorizontal, 0, moveVertical);
        // 플레이어의 Rigidbody에서 movement 값만큼 힘을 가해서 이동시킴
        rb.AddForce(movemnet * speed);
    }

    // 트리거 콜라이더를 처음 접촉할 때 호출
    void OnTriggerEnter(Collider other)
    {
        // 오브젝트의 태그 값 비교
        if ( other.gameObject.CompareTag("PickUp"))
        {
            // 오브젝트 비활성화
            other.gameObject.SetActive(false);
            // 점수 카운트 업
            count = count + 1;
            // 점수 텍스트 표시
            SetCountText();
        }
    }

    // 점수 텍스트 표시
    void SetCountText()
    {
        CountText.text = "Count: " + count.ToString();
        // 12개 오브젝트 전부 수집시에 승리 텍스트 표시
        if (count >= 12)
        {
            WinText.text = "You Win!";
        }
    }
}

Player -> Inspector -> Player Controller(Script) -> Count Text, Win Text에 UI Text 설정

 

-Reference

[Displaying the Score and Text] https://unity3d.com/kr/learn/tutorials/projects/roll-ball-tutorial/displaying-score-and-text?playlist=17141

 

+ Recent posts