디지털트윈 유니티 (animation,recoder,유니티 파일 허브에서 여는방법 등)

coc·2026년 4월 14일

  1. animation을 먼저 만든다

힌지는 그래돌 납두고 자식 오브젝틀 이동해서 hinge 위치를 끝으로 조정

이게 힌지다

최상 부모를 잡고 애니메이션을 생성 그러면 최상단 부모에 animatior가 생성됨

부모에서 animation 움직일거 hinge(position,Rotation)를 움직이면 된다

프레임 번호를 지정하고 프레임 마다 rotation,position을 조절 하면 된다

박스는 힌지를 기준으로 움직이게 된다

녹화를 키고 animation을 설정

animator 설정
체크한 부분에 애니메이션을 넣어야 동작한다

none은 = 가만히 있는 상태를 의미한다

isopen 이 체크되어있으면 문이열리고
isopen 이 체크가 안되어 있으면 문이 닫힌다

isopen 에 상태값을 저렇게 false,true값으로 넣어야 한다

최상위 부모의 코드를 넣는다

이렇게 colider에서 ls trigger 체크하면 밑이미지 코드들이 동작된다

따로 감지 부분을 분리해서 하고싶으면 이렇게 분리해서 area에 animator를 꼭 넣어야 한다
애니메이터가 누군지 꼭 설정해줘야한다 따로 분리해서 사용할거면

time line

timeline은 animator 위 상위 기능이다

animation 예제

다른 유니티 파일 여는방법

파일 압축을 풀고 이름 변경(이름 변경은 자기 마음대로 변경안해도 상관없음)

체크한거를 클릭

자신이 사용하고 있는 버전으로 변경

컨티뉴를 선택하면 프로젝트에서 열린다

유니티에서 폴더 푼거 열어야 할거

메인 카메라 설정 ,라이트

메인 카메라는 한 개 만 있게 해야한다

라이트도 한 개 만 있게 한다

카메라,빛 시점 변경 단축키

ctrl+shift+f 는 카메라에만 사용해야한다

유니티(Unity)에서 Ctrl + Shift + F 단축키는 'Align with View'라는 기능을 수행합니다.

쉽게 말해, "내가 지금 씬 뷰(Scene View)에서 보고 있는 화면 그대로 카메라의 위치와 각도를 맞춰라"라는 뜻이에요.

이렇게 카메라를 선택후 봐야할 방향을 보고 ctrl+shift+f를
누르면 그화면으로 전환된다

카메라 설정

애니메이션 꼭 해야할거

애니메이션할때는 녹화를 키고 프레임마다 넣기

iptime 열때 이걸로 열어야 한다

에셋 스토어 들어가는 방법

stater asset 쓸때 이것도 다운받기

이렇게 가져올수 있다


그리고 player를 위로 올리는 방법은
PlayerArmature를 선택하고 이동 할 수있다

alt 누르고 클릭 전체 폴더 열리고 다시 반대로 하면 닫힌다
그리고 DUFRH SKTJ CTRL+A 하고
CHARTER를 접고 전체 선택해야 MESHRENDERER가 뜬다

CONVEX를 쓰면 작은 캐릭터가 의자밑으로 못 지나간다
대신 부하를 줄일수 있다

밑 두가지 폴더를 ALT + 클릭으로 하면 모든 폴더가 열린다
그리고 꼭 CHARTER 폴더는 접고 CTRL+A 로 전체선택

PREFABS를클릭한다

MESH COLIIDER를추가한다

STARTER 에서CHARTER를 넣고

이거를 끌어서 SCENE에다가 넣으면 된다

PlayerArmature 를 클릭한다

그다음에 당기면 올라온다 그다음에 시뮬을 돌리면 캐릭터가 낙하하지 않고 그대로 이동할수 있다

RECODER 를 꼭사용

동영상과 이미지캡처 애니메이션 효과도 만들수 있다

시뮬돌리는 중일때는 이미지에서 RECODER 가 안보인다
그러므로 시뮬 종료하고 다시 들어가면 작동 잘된다

레코더 사용방법들

10초가 600프레임이다

비활성화

비활성화

비활성화

과제

자동차 움직이는 코드

 using UnityEngine;
using UnityEngine.InputSystem;

public class CarController : MonoBehaviour
{
    [Header("설정")]
    public float moveSpeed = 10f;
    public float boostSpeed = 25f;
    public float turnSpeed = 150f;
    public float maxSteerAngle = 30f; // 바퀴가 최대 몇 도까지 꺾일지

    [Header("바퀴 연결 (앞바퀴 2개만 넣어도 됨)")]
    public Transform wheelFL; // 전면 왼쪽
    public Transform wheelFR; // 전면 오른쪽

    public bool isControlling = true;

    void Update()
    {
        if (!isControlling) return;

        var keyboard = Keyboard.current;
        if (keyboard == null) return;

        // 1. 이동 처리
        float currentSpeed = keyboard.spaceKey.isPressed ? boostSpeed : moveSpeed;
        float moveInput = 0;
        if (keyboard.wKey.isPressed) moveInput = 1;
        else if (keyboard.sKey.isPressed) moveInput = -1;

        transform.Translate(Vector3.forward * moveInput * currentSpeed * Time.deltaTime);

        // 2. 회전 및 바퀴 조향 처리
        float turnInput = 0;
        if (keyboard.dKey.isPressed) turnInput = 1;
        else if (keyboard.aKey.isPressed) turnInput = -1;

        // 차체 회전
        transform.Rotate(Vector3.up, turnInput * turnSpeed * Time.deltaTime, Space.Self);

        // 앞바퀴 시각적 조향 (Y축 회전)
        if (wheelFL != null && wheelFR != null)
        {
            float steerAngle = turnInput * maxSteerAngle;
            // 바퀴의 로컬 회전값을 설정 (0, 꺾인각도, 0)
            wheelFL.localRotation = Quaternion.Euler(0, steerAngle, 0);
            wheelFR.localRotation = Quaternion.Euler(0, steerAngle, 0);
        }
    }
}

자동차 랜덤으로 움직이게 하는 코드

using UnityEngine;

public class CarRandom : MonoBehaviour
{
    public float minSpeed = 5f;
    public float maxSpeed = 15f;
    private float currentSpeed;

    void Start()
    {
        currentSpeed = Random.Range(minSpeed, maxSpeed);
    }

    void Update()
    {
        transform.Translate(Vector3.forward * currentSpeed * Time.deltaTime);
    }

    private void OnTriggerEnter(Collider other)
    {
        Debug.Log(other.name);
        Debug.Log(other.gameObject.name);
        // 1. 우회전 칸에 닿았을 때
        if (other.gameObject.name == "Turn_Right")
        {
            transform.Rotate(0, 90, 0);
        }
        // 2. 좌회전 칸에 닿았을 때
        else if (other.gameObject.name == "Turn_Left ")
        {
            transform.Rotate(0, -90, 0);
            Debug.Log("name");
        }
        // 3. 180도 유턴 칸이 필요하다면
        else if (other.gameObject.name == "Turn_U")
        {
            transform.Rotate(0, 180, 0);
        }
    }
}

포크레인 제어 코드

using UnityEngine;
using UnityEngine.InputSystem;

public class NewMonoBehaviourScript : MonoBehaviour
{
    // header는 [Header("문구")]는 유니티 에디터의 인스펙터 창에서 변수들 위에 굵은 글씨의 제목을 달아주는 역할을 합니다.
    [Header("[기본 이동 설정]")]
    public float moveSpeed = 10f;
    public float boostSpeed = 25f;
    public float turnSpeed = 150f;
    public float maxSteerAngle = 30f;

    [Header("[바퀴 연결 (앞바퀴 2개)]")]
    public Transform wheelFL;
    public Transform wheelFR;

    [Header("[굴착기 팔 연결 (이미지 참고)]")]
    // 이미지 6번: 붐 (가장 큰 팔)
    public Transform excavatorArm01;
    // 이미지 5번: 암 (중간 팔)
    public Transform excavatorArm02;
    // 이미지 4번: 버킷 (바가지)
    public Transform excavatorBucket02;

    [Header("[굴착기 작동 속도]")]
    public float armTurnSpeed = 50f; // 팔이 움직이는 속도

    public bool isControlling = true;

    // 조작 편의성을 위한 플래그 (엔터키로 운전/굴착 모드 전환)
    private bool isExcavatorMode = false;

    void Update()
    {
        if (!isControlling) return;

        var keyboard = Keyboard.current;
        if (keyboard == null) return;

        // [모드 전환 Logic] 엔터키를 누르면 운전 <-> 굴착 모드 전환
        //wasPressedThisFrame: 키를 누른 그 순간(첫 프레임)에만 딱 한 번 true가 되고, 계속 누르고 있어도 다음 프레임부터는 false가 됩니다. (모드 전환, 점프, 메뉴 열기 등에 사용)
        if (keyboard.enterKey.wasPressedThisFrame)
        {
            isExcavatorMode = !isExcavatorMode; // true로 변경
            Debug.Log(isExcavatorMode ? "굴착 모드 활성화" : "운전 모드 활성화");
        }

        if (isExcavatorMode)
        {
            // ----------------------------------------------------
            // 🚜 [굴착 모드 조작] 
            // ----------------------------------------------------

            // 엔터키를 눌러서 모드 전환
            /*1. [T] / [G] 키 (이미지 6번: 가장 큰 팔 - Boom)
            키보드에서 R과 Y 사이에 있는 키들입니다.

            [T]: 팔을 위로 들어 올리기

            [G]: 팔을 아래로 내리기

            (팁: 위아래 수직 방향이라 세로로 배치된 키를 사용했습니다.)

            2. [Y] / [H] 키 (이미지 5번: 중간 팔 - Arm)
            T와 G 바로 오른쪽에 있는 키들입니다.

            [Y]: 중간 팔을 안쪽으로 굽히기

            [H]: 중간 팔을 바깥쪽으로 펴기

            3. [V] / [B] 키 (이미지 4번: 바가지 - Bucket)
            스페이스바 바로 위에 나란히 있는 키들입니다.

            [V]: 버킷을 안쪽으로 오므려 흙 담기

            [B]: 버킷을 바깥으로 펴서 흙 쏟기

            (팁: 좌우로 나란히 있어 '오므리기/펴기' 느낌을 주려고 배치했습니다.)
             */


            // 1. 이미지 6번 (Arm_01 - 붐) 제어: TF / GH 키
            float arm01Input = 0;
            if (keyboard.tKey.isPressed) arm01Input = 1; // 들기
            else if (keyboard.gKey.isPressed) arm01Input = -1; // 내리기
            RotatePart(excavatorArm01, arm01Input, Vector3.right); // 로컬 X축 회전 가정

            // 2. 이미지 5번 (Arm_02 - 암) 제어: FH / RY 키
            float arm02Input = 0;
            if (keyboard.yKey.isPressed) arm02Input = 1; // 굽히기
            else if (keyboard.hKey.isPressed) arm02Input = -1; // 펴기
            RotatePart(excavatorArm02, arm02Input, Vector3.right); // 로컬 X축 회전 가정

            // 3. 이미지 4번 (Bucket_02 - 버킷) 제어: CV / BN 키
            float bucketInput = 0;
            if (keyboard.vKey.isPressed) bucketInput = 1; // 오므리기
            else if (keyboard.bKey.isPressed) bucketInput = -1; // 펴기
            RotatePart(excavatorBucket02, bucketInput, Vector3.forward); // 로컬 Z축 회전 가정 (이미지 4번 피벗 참고)
        }
        else
        {
            // ----------------------------------------------------
            // 🚗 [기본 운전 모드 조작 - 기존 코드]
            // ----------------------------------------------------

            // 1. 이동 처리
            float currentSpeed = keyboard.spaceKey.isPressed ? boostSpeed : moveSpeed;
            float moveInput = 0;
            if (keyboard.wKey.isPressed) moveInput = 1;
            else if (keyboard.sKey.isPressed) moveInput = -1;

            transform.Translate(Vector3.forward * moveInput * currentSpeed * Time.deltaTime);

            // 2. 회전 및 바퀴 조향 처리
            float turnInput = 0;
            if (keyboard.dKey.isPressed) turnInput = 1;
            else if (keyboard.aKey.isPressed) turnInput = -1;

            // 차체 회전
            transform.Rotate(Vector3.up, turnInput * turnSpeed * Time.deltaTime, Space.Self);

            // 앞바퀴 시각적 조향
            if (wheelFL != null && wheelFR != null)
            {
                float steerAngle = turnInput * maxSteerAngle;
                wheelFL.localRotation = Quaternion.Euler(0, steerAngle, 0);
                wheelFR.localRotation = Quaternion.Euler(0, steerAngle, 0);
            }
        }
    }

    // 부품을 부드럽게 회전시키는 공통 함수
    void RotatePart(Transform part, float input, Vector3 rotationAxis)
    {
        if (part != null && input != 0)
        {
            // Space.Self를 써야 로컬 축 기준으로 회전합니다.
            part.Rotate(rotationAxis, input * armTurnSpeed * Time.deltaTime, Space.Self);
        }
    }
}

수정할거

이미지 처럼 boxcolider 하고 rigidbody를 같이 넣어줘야 감지 된다

동영상 내보내기

저장할 경로 지정

profile
시작

0개의 댓글