반응형

 

 

 

제원 (MiG-15bis) (유용원 군사세계)

- 형식 : 단발 터보제트 전투기
- 전폭 : 10.085m
- 전장 : 10.102m
- 전고 : 3.7m
- 주익 면적 : 20.6㎡
- 최대 이륙 중량 : 6,106kg
- 엔진 : 클리모프 VK-1 터보제트(5,950파운드) × 1
- 최고 속도 : 마하 0.9(1,107km/h)
- 실용 상승 한도 : 10,080m
- 최대 항속 거리 : 2,520km
- 무장 : 23mm NR-23 기관포 × 2
         37mm N-37 기관포 × 1
         2개 하드포인트에 각 100kg 폭장

반응형
반응형

 

3DS MAX 모델링 하였습니다.

 

제원   (나무위키 자료)

MiG-21bis 제원[4]
전장
15m
전폭
7.15m
전고
4.1m
자체 중량
5.3톤
10.4톤
최고 속도
마하 2.05
실용상승한도
17,800m
항속거리
1,210km
엔진
투만스키 R-25-300 터보제트 엔진[5] 1기
무장
GSh-23L 23mm 쌍열 기관포 1문
R-13, R-60 단거리 공대공 미사일
로켓, 무유도 항공폭탄,RN-24/28 전술핵폭탄

 

대한민국의 F-5 와 비교 되는 전투기 입니다.

한국에서도 1983년 망명한 중공기(중국판 MiG-21인 J-7)로 F-5와 모의교전을 해본적이 있고, 중국에서도 망명한 대만 F-5를 가지고 J-7과 모의교전을 시켜봤다고 한다.

실제 두 기종이 맞붙었던 이란-이라크 전쟁에서는 거의 비슷한 전과를 냈고, 무승부로 평가했다고 한다

https://youtu.be/JczYeZncQCA

 

반응형
반응형

FA-50 모델링한 것을 페인팅 하였습니다

3DS MAX 로 모델링 하였습니다 

 

 

 

약간 윗 왼쪽

 

 

약간 윗 오른쪽

윗쪽

뒷면

 

뒷면 왼쪽

 

뒷면 오른쪽

 

윗면

 

 

360도 동영상

 

 

반응형
반응형

3DS MAX 모델링 하였습니다 

아직  맵핑은 안되어 있고 모델링만 하였습니다.

 

FA-50 제원 (나무위키 자료)

한국항공우주산업(KAI) FA-50 파이팅 이글 출처
분류
단발 터보팬 초음속 경전투기/경공격기
승무원
2명 (조종사, 무장관제사)
길이
13.14m (43ft 1in)
날개폭
9.45m (31ft)
높이
4.94m (16.2ft)
날개면적
23.69㎡ (255ft²)
주익 후퇴각
35도
자체중량
6,454kg (14,228lb)
내부연료량
2,500kg (5,500lb)
전비중량
8,900kg (19,621lb)
최대이륙중량
13,500kg (30,000lb)
항전장비
레이더
이스라엘 ELTA - EL/M-2032 기계식 레이더
레이시온 팬텀 스트라이크[AESA][B20]
데이터 링크
Link-16
엔진
 F404-GE-102 후연 터보팬[4]
최고추력
11,933lbf (53.1kN)
재연소 시 추력
17,700lbf (78.7kN)
최고속도
마하 1.5+
전투행동반경
444km (230nm[5])
무장 기준(중앙 연료탱크 1기[6], AIM-9 2발, AGM-65 2발)
기본항속거리
1,852km (1,000nm)
연료탱크 장착 시 항속거리
2,592km (1,400nm)
실용상승한도
14,800m (48,500ft)
상승률
201m/s (35,600ft/min)
지속선회율
14.5도/s (15,000ft E-M차트)
하드포인트
총 7개소[7]
무장
고정
20 mm M197 3열 기관포 1기
폭탄
미사일
기타 외부 무장
외부 연료 탱크 3기[16], 300갤런 외부 연료 탱크[B20]
스나이퍼(타게팅 포드)(블록 10)
기타

 

 

정면 모습

 

 

뒷모습

 

 

위에서 본 모습

 

 

와이어 프레임

 

 

영상

 

반응형
반응형

Enemy 스크립트 작성합니다 

 

Enemy 스크립트를 작성

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Enemy : MonoBehaviour
{
    public GameObject deathVFX;
    public GameObject hitVFX;
    public Transform parent;
    public int scorePerHit = 15;
    public int hitPoint = 4;

    ScoreBoard scoreBoard;

    private void Start()
    {
        scoreBoard = FindObjectOfType<ScoreBoard>();
    }

    
    private void OnParticleCollision(GameObject other)
    {
        ProcessHit();
        //hitPoint 0 이하일때 적을 파괴한다 
        if (hitPoint <1 )
        {
            KillEnemy();
        }
                   
    }

    //점수를 증가한다 
    private void ProcessHit()
    {
        GameObject vfx = Instantiate(hitVFX, transform.position, Quaternion.identity);
        vfx.transform.parent = parent;
        hitPoint--;
        scoreBoard.IncreaseScore(scorePerHit);
    }

    //외부 물체와 부딛칠때 이팩트생성한다.그리고 삭제 
    private void KillEnemy()
    {
        GameObject vfx = Instantiate(deathVFX, transform.position, Quaternion.identity);
        vfx.transform.parent = parent;
        Destroy(gameObject);
    }


}

 

 

 

 

큐브(Cube) 이름을 Enemy로 바꿉니다 

 

 

빈 오브젝트를 만들고 이름을 Spawn A Runtime으로 바꿉니다 

 

 

 

 

 

 

 

 

각각 Enemy 에 스크립트를 붙이고 아래그림과 같이 이팩트와 오브젝트를 붙입니다 

 

Package Manager 를 열고 TextMeshPro를 설치합니다 

UI -> Text - TextMeshPro 를 실행합니다 

 

ScoreBoard 스크립트 작성

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;

public class ScoreBoard : MonoBehaviour
{

    int score;

    TMP_Text scoreText;


    private void Start()
    {
        scoreText = GetComponent<TMP_Text>();
        scoreText.text = "Start";
    }
    public void IncreaseScore(int amountToIncrease)
    {
        score += amountToIncrease;
        scoreText.text = score.ToString();
    }
}

Text 를 왼쪽 아랫단에 보이게 합니다 

 

 

 

Canvas를 선택하고  Screen Space - Overlay 선택  Canvas Scaler -> Ui Scale Mode -> Scale with Screen Size ,  Reference Resolution  X : 1920 Y: 1080으로 합니다 

 

Text 이름을 ScoreBoard 로 합니다 

 

 

ScoreBoard 스크립트를 붙힘니다 

게임을 실행 시켜서  장애물을 파괴했을 때 점수와 이팩트가 잘 터지는지 확인합니다

 

게임자료

3DTimeLime_F.vol1.egg
10.00MB
3DTimeLime_F.vol2.egg
10.00MB
3DTimeLime_F.vol3.egg
9.75MB

반응형
반응형

아래 있는 Effect 유니티 파일을 다운로드합니다 

Effect.unitypackage
0.04MB

 

 

 

임포트 합니다 

 

 

 PlayerRig 오브젝트 자식으로 있는  PlayerShip을 선택하고   Prefabs 폴더 안에 있는 Laser 프리팹을 드래그하여 자식으로 놓고 하나 더 복사하여 이름을 Laser_Right , Laser_Left로 합니다 

그리고 각각의 위치를 비행기 날개에서 발사 되는 위치에 적당히 올려놓습니다 

 

 

 

PlayerControls 스크립트 수정합니다 

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.Rendering.HighDefinition;

public class PlayerControl : MonoBehaviour
{   
    public float controlSpeed = 10f;
    public float xRange = 12f;
    public float yRange = 10f;
    [SerializeField] GameObject[] lasers;

    public float positionPithcFactor = -2f;
    public float controlPithcfactor = -10f;
    public float positionYawFactor = 2f;

    public float controlRollFactor = -20f;
    [SerializeField] InputAction fire;

    float xThrow;
    float yThrow;
    void Update()
    {
        ProcessTranslation();
        ProcessRotation();
        ProcessFiring();
    }

    void OnEnable()
    {
        fire.Enable();
    }

    private void OnDisable()
    {
        fire.Disable();
    }

    //상하좌우로 움직일때 로컬 로테이션을 준다 
    void ProcessRotation()
    {
        //y축 로컬 움직임 팩터
        float pitchDueToPosition = transform.localPosition.y * positionPithcFactor;
        float pitchdueToControlThrow = yThrow * controlPithcfactor;


        float pitch = pitchDueToPosition + pitchdueToControlThrow;
        //x축 로컬 움직임 팩터
        float yaw = transform.localPosition.x * positionYawFactor;
        float roll = xThrow * controlRollFactor;

        //로컬축으로 로테이션한다
        transform.localRotation = Quaternion.Euler(pitch, yaw, roll);
    }
    private void ProcessTranslation()
    {
        //좌우 입력
        xThrow = Input.GetAxis("Horizontal");
        //상하 입력
        yThrow = Input.GetAxis("Vertical");

        //시간에 따라 좌우 움직임을 준다 
        float xoffset = xThrow * Time.deltaTime * controlSpeed;
        float rawXPos = transform.localPosition.x + xoffset;

        //플레이어 좌우 이동 제한
        float clampedXPos = Mathf.Clamp(rawXPos, -xRange, xRange);

        //시간에 따라 상하 움직임을 준다 
        float yoffset = yThrow * Time.deltaTime * controlSpeed;
        float rawYpos = transform.localPosition.y + yoffset;

        //플레이어 상하 이동 제한
        float clampedYPos = Mathf.Clamp(rawYpos, -yRange, yRange);

        //키를 누르면 오브젝트를 상하좌우로 움직이게 한다 
        transform.localPosition = new Vector3(clampedXPos, clampedYPos, transform.localPosition.z);
    }

    

    void ProcessFiring()
    {
    //마우스 오른쪽 버튼을 누르면 미사일(ON)시켜 발사하고 그러지 않을땐 Off 한다
        if (Input.GetButton("Fire1"))
        {
            SetLasersActive(true);
        }
        else
        {
            SetLasersActive(false);
        }
    }
    

   
    //레이져 발사 이팩트를 껐다 켰다 한다
    void SetLasersActive(bool isActive)
    {
        foreach (GameObject laser in lasers)
        {
            var emissionModule = laser.GetComponent<ParticleSystem>().emission;
            emissionModule.enabled = isActive;
        }
    }
  
}

 

Laser_Right , Laser_Left  오브젝트를 드래그 하여 PlayerControls 스크립트 Lasers 위치에 드래그하여 올려놓습니다 

 

 

 

 

게임을 실행시켜서 비행기에 총알이 나가는지 확인합니다 

 

총알이 튕겨져 나갈땐  Lasers 프리팹을 열고 Particle System -> Collision을 열고 Min Kill Speed 값을 올려 봅니다 

 

PlayerShip를 선택하고 Physics -> Box Collider를 선택합니다  

 

 

 

PlayerShip 를 선택하고 Physics -> Rigidbody를 선택합니다  

 

 

Box Collider -> is Trigger 체크하고 Use gravity 체크해제 하고 is Kinematic 체크합니다 

 

 

Collision Handler 스크립트 작성

비행기가 외부 물체와 부딪칠때 게임이 재실행하는 스크립트를 작성합니다 

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;


public class CollisionHandler : MonoBehaviour
{
    public float loadDelay = 1f;
    public ParticleSystem crashVFX;



    //외부 물체와 충돌하였을때 
    private void OnTriggerEnter(Collider other)
    {
        StartCrashSequence();
    }

    //crashVFX 이팩트를 실행, PlayerControl실행을 중지한다.그리고 1초후 다음 씬으로 이동한다 
    private void StartCrashSequence()
    {      
        crashVFX.Play();
        GetComponent<PlayerControl>().enabled = false;
        GetComponent<MeshRenderer>().enabled = false;
        GetComponent<BoxCollider>().enabled = false;

        Invoke("ReloadLevel", loadDelay);
    }

    void ReloadLevel()
    {
        int currentSceneIndex = SceneManager.GetActiveScene().buildIndex;
        SceneManager.LoadScene(currentSceneIndex);
    }
}

 

 

PlayerShip에 드래그하여 붙입니다 

 

 

PlayerRig 하위 밑으로 Player Explosion VFX 프리팹을 드래그하여 놓고 비행체 중앙에 놓습니다 

 

Collision Handler 스크립트 Crash VFX 공간에 드래그 하여 Player Explosion VFX를 놓습니다 

 

비행기가 비행하는 선로에 큐브를 생성하여 비행기가 부딪칠 수 있도록 합니다 

 

 

File -> Build Settings 들어가서 현재 씬을 드래그하여 Build Settings에 올립니다 

게임을 실행하여 장애물인 큐브에 부딪 칠때  이팩트가 터지고 게임이 재실행되는지 확인합니다 

 

 

반응형
반응형

유니티 2023.1.2.1에서 작업

유니티 에셋을 들어가서 Realistic Terrain Collection Lite  무료 에셋을 다운로드합니다 

window -> Package Manager 를 열고  임포트 합니다

 

임포트 한 파일에서 Terrain 5 파일 안에 자기가 맘에 드는 Terrain 파일 하나를 골라 Hierarchy 안으로 끄집어 올려놓습니다  

 

 

 

 

 

에셋 스토어에 다시 들어가서 Star Sparrow Modular Spaceship 에셋을 다운 받습니다 

 

Package Manager 에서 임포트 하여 다운로드합니다 

 

 

 

 

 

다운로드한 Star Sparrow 파일에서 Prefabs 폴더의 Examples에서 맘에 드는 비행기를 하나 골라서 Hierarchy 위에 끄집어 올려놓습니다 

 

올려놓은 비행기의 이름을 PlayerShip 으로 바꾸고 Assets폴더에 Prefabs 폴더를 하나 만들어서 드래그하여 프리팹으로 만듭니다 

 

 

 

 

 

 

 

오른쪽 마우스 버튼을 눌러서  Create Empty 오브젝트를 만든 다음 이름을 PlayerRig 로 바꾸고  Transform 값을 아래 그림과 같이 놓습니다  그리고 자식으로 PlayerRig와 Transform 값을 같은 값으로 하고 아래 그림과 같이 자식으로 놓습니다 

그리고 PlayerRig 자식으로 Main Camera 를 두고 Transform 값을 아래 그림과 같이 하여 카메라 보는 각도가 비행기 뒤쪽에서 바라보게 끔 합니다 

 

 

 

 

 

Create Empty 를 만들고 이름을 Master Timeline으로 합니다 

Master Timeline 선택하고 Window -> Sequencing -> Timeline 을 클릭하여 Timeline 창을 보이게 합니다 

 

Master Timeline 오브젝트를 선택하고  Timeline 창에 Create 버튼을 클릭하고 타임라인저장할 Assets 폴더에 새로운 폴더를 만듭니다 

 

Master Timeline 오브젝트를 선택하고 Timeline 창에서 +버튼을 누르고   Animation Track 를 선택합니다 

 Timeline 창에서 오른쪽의 자물쇠 모야을 잠금으로 합니다 

 

 

PlayerRig 오브젝트를 드래그 하여 Timeline 창의 Animation Track에 드래그합니다  

 

Timeline 창에서 아래와 같이 빨간 버튼을 누릅니다 

 

PlayerRig를 움직이면 Timeline 시간대에 점이 찍힘니다 PlayerRig를 자기가 움직이고 싶은 위치와 Timeline 시간대에 갔다 놓으면 됩니다  

 

Timeline의 아래와 같이 선 모양의 아이콘을 클릭하면 Animated Values 가 나오는데 찍혀있는 점들을 움직이면 위치와 회전을 바꿀 수 있습니다 

 

 

 

 

 

아래와 같이 PlayerRig 움직여 Timeline 시간대에 점이 찍히는 방향대로 움직인 결과 입니다 

 

 

Assets에 Scripts 폴더를 만들고 새로운 스크립트를 생성하여 이름을 PlayerControl을 만듭니다

 

 

 

 

 

스크립트를 작성합니다 

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//using UnityEngine.InputSystem;
//using UnityEngine.Rendering.HighDefinition;

public class PlayerControl : MonoBehaviour
{   
    public float controlSpeed = 10f;
    public float xRange = 12f;
    public float yRange = 10f;
   

    public float positionPithcFactor = -2f;
    public float controlPithcfactor = -10f;
    public float positionYawFactor = 2f;

    public float controlRollFactor = -20f;
   

    float xThrow;
    float yThrow;
    void Update()
    {
        ProcessTranslation();
        ProcessRotation();    
    }

    //상하좌우로 움직일때 로컬 로테이션을 준다 
    void ProcessRotation()
    {
        //y축 로컬 움직임 팩터
        float pitchDueToPosition = transform.localPosition.y * positionPithcFactor;
        float pitchdueToControlThrow = yThrow * controlPithcfactor;


        float pitch = pitchDueToPosition + pitchdueToControlThrow;
        //x축 로컬 움직임 팩터
        float yaw = transform.localPosition.x * positionYawFactor;
        float roll = xThrow * controlRollFactor;

        //로컬축으로 로테이션한다
        transform.localRotation = Quaternion.Euler(pitch, yaw, roll);
    }
    private void ProcessTranslation()
    {
        //좌우 입력
        xThrow = Input.GetAxis("Horizontal");
        //상하 입력
        yThrow = Input.GetAxis("Vertical");

        //시간에 따라 좌우 움직임을 준다 
        float xoffset = xThrow * Time.deltaTime * controlSpeed;
        float rawXPos = transform.localPosition.x + xoffset;

        //플레이어 좌우 이동 제한
        float clampedXPos = Mathf.Clamp(rawXPos, -xRange, xRange);

        //시간에 따라 상하 움직임을 준다 
        float yoffset = yThrow * Time.deltaTime * controlSpeed;
        float rawYpos = transform.localPosition.y + yoffset;

        //플레이어 상하 이동 제한
        float clampedYPos = Mathf.Clamp(rawYpos, -yRange, yRange);

        //키를 누르면 오브젝트를 상하좌우로 움직이게 한다 
        transform.localPosition = new Vector3(clampedXPos, clampedYPos, transform.localPosition.z);
    }
   
}

 

 

PlayerShip 오브젝트를 선택하고 PlayerControl 스크립트를 드래그 하여 붙입니다

그리고 아래그림과 같이 데이터 값을 넣습니다 

게임을 실행시켜서 AD(좌우) WS(상하) 키를 움직여서 비행기가 화면을 벋어나지 않고 잘 움직이는지 확인합니다  

 

 

 

반응형
반응형

터레인을 만들고 배경으로 만들어 넣습니다 

하이라키 뷰에 큐브를 생성합니다 

 

 

빈 오브젝트를 생성하고 이름을 Player이름을 넣고 포지션을 리셋합니다 

Player 오브젝트에 Cube를 자식으로 넣고 스케일을 아래그림과 같이 5,2,5로 합니다 

그리고 Main Camera도 Player자식으로 넣고 아래그림과 같이 Transform을 바꾸어 줍니다 

 

게임뷰에서의 Player 모습

 

터레인 적당한 곳에 Player를 놓습니다 

 

 

 

 

작업창에서 Window > Sequencing > Timeline을 생성합니다 

 

하이라키 뷰에서 빈오브젝트를 생성하고 이름을 Master Timeline 으로 합니다 

Master Timeline 오브젝트를 선택하고 Timeline 창에서 Create 버튼을 누르고 Timeline이름으로 폴더를 생성하여 Master Timeline에 Playable Director 형식의 Component를 생성합니다 

 

 

 

Timeline창에서 + 버튼을 클릭하고 Animation Track을 생성합니다 

 

그리고 Player오브젝트를 드래그 하여 빈 곳에 넣습니다  

 

빨간 아이콘을 누릅니다 

 

 

 

 

Player 오브젝트 Transform을 움직이면 움직임에 반응하여 빨간 창으로 바뀌는 것을 볼 수 있습니다 

 

타임라인 하얀 막대선을 타임에 옮기고  오브젝트를 움직이면 타임라인에 도트표시가 나타남니다

 

타임라인 제어창을 열고  타임라인을 Seconds로 바꿉니다 

 

타임라인 막대기를  옮기면서 Player 위치를 각각 변화시켜줍니다 

타임라인에 도트가 찍힌 모습입니다  

 

 

 

 

타임라인 Play 영상

 

 

반응형
반응형

Hierarchy 창에서 오른쪽 마우스 버튼을 클릭하고 3D object  > Terrain을 클릭합니다 

 

Scene창에서 테레인이 생성 되었습니다 

 

 

터레인을 선택하고 Inspector 창에서 Terrain Settings을 클릭하고 테레인의 크기를 자기가 원하는 크기에 맞게 설정합니다 

 

터레인을 선택하고 Inspector 창에서 Paint Terrain 아이콘을 선택하고 아래 Raise or Lower Terrain을 선택합니다 

그리고 자기가 원하는 Brushes 의 모양을 선택합니다 

 

터레인을 선택하고 브러쉬를 움직이면 브러시 모양으로 산을 만들 수 있습니다

브러시 사이즈를 크기를  조절하려면 키보드 [    ]  키를 누르면 조절 할 수 있습니다

Shift 키를 누르면 산모양을 점차 줄어들게 할수 있습니다

+ - 키를 누르면 브러시의 강도를 조절할 수 있습니다 

, .  키를 누르면 브러시의 모양을 순차적으로 선택할 수 있습니다 

기타 단축키는 Edit  > Shotcuts에서 확인할 수 있습니다 

 

 

 

 

Window > Packge Manager를 엽니다

 

 

Package Manager 창에서  Packages: Unity Registry를 열고  Terrain Tools를 Install 합니다 

 

Terrain Tools 를 설치하였을 때 단축키 메뉴입니다 

설치하면 터레인 브러시 단축키가 아래와 같이 새롭게 됩니다  

 

 

Window > Asset Store로 가서 Terrain Textures Pack Free와  Relistic Tree 9를 설치합니다

에셋스토어에 가면 무료의 터레인 텍스쳐와 나무들이 있으니 사용자가 원하는 에셋을 설치하면 됩니다 

 

 

 

 

터레인을 선택하고 Paint Terrain > Paint Texture를 선택합니다

그리고  Layers > Add Layer를 선택하여  본인이 칠하고 싶은 색깔의 Texture를 선택합니다 

 

 

또다시 Add Layer >  텍스쳐를 선택하고 텍스쳐 색깔에 맞게 브러시로 색을 칠합니다 

 

 

터레인을 선택하고 Paint Trees 아이콘을 선택합니다

그리고 Edit Trees 아이콘을 누르면 Add Tree를 선택할 수 있습니다 

 

자신이 원하는 Tree를 선택하고 나무를 생성할 수 있는 브러시사이즈와 나무의 생성 밀집도 나무 크기의 범위를 선택할 수 있습니다 

 

 

터레인에 브러시를 이용하여 나무를 생성하였습니다 

반응형
반응형

주요제원

승무원 2명

길이 10.26m

날개폭 10.60m

높이 3.67m

자체중량 2040kg

최대 이륙중량 3311kg

엔진 PT6A-62 터보프롭  950hp(708kw)

수평 최대 속도 500km/h

실속 속도 130km/h

항속거리 1688km

실용 고도 11580m

상승률 17.8 m/s

체공시간 3시간 30분

무장적재량 1000kg

기체수명 1만시간

 

 

무장

하드 포인트 양날개 2개씩, 동체중앙 1군데 총 5개  

기본 무장 70mm 로켓, 12.7mm 기관총 

 

 

 

 

 

 

 

 

 

https://www.youtube.com/watch?v=piQbe-8C58

 

반응형
반응형

2차 세계대전 당시 미국의 전투기 

헬리콥터 회사인 벨 항공사에서 개발했습니다

전장 9.19m
전폭 10.36m
전고 3.78m
승무원 1명
익면적 19.8m²
자체중량 2,956kg
전비중량 3,434kg
최대이륙중량 3,810kg
엔진 앨리슨 V-1710-85 12기통 수랭식 엔진(1,200 마력), 슈퍼차져 장착
최고속도 626km/h
작전반경 845km[2]
최고 고도 11,000m
상승률 19.33m/s[3]
무장 37mm M4 기관포 1문
12.7mm M2 브라우닝 중기관총 4정 - 기수에 둘, 주익에 둘
주익과 동체 하방에 최대 230kg의 폭장

 

 

 

 

 

 

https://youtu.be/21-a0iNHNiE

 

반응형
반응형

3DS Max에서 모델링한 로봇을 중심으로  카메라가   360도 회전하는 방법을 설명드리겠습니다  

 

3DS 맥스 타임라인 아래 Time Configuration을 클릭하면 Start Time과 End Time을 설정할 수 있습니다 

창을 열고 셋팅값을 넣습니다 

 

 

 

 

로봇 중심과 화면 중심에 잡고 Ctrrl + C를 누르면  카메라가 생성이 되어  카메라 모드의 화면이 됩니다 

 

Top 뷰에서 로봇을 중심으로 Circle을 만들고 서클 라인에 카메라가 닿도록 서클 반경을 설정합니다 

 

그리고 써클을 선택하여 ALT+A 를 누르고 아이콘이 바뀌면 로봇 중심에 해당하는 물체를 선택하고 Align Selection을 아래 그림과 같이 설정합니다 

 

LEFT 뷰를 열고 써클을 선택하여 카메라 높이에 맞춥니다 

 

 

 

카메라를 선택하고 맥스 Animaton 메뉴를 클릭하고 Position Controllers -> Path Constraint를 선택하면 카메라와 연결된 마우스 포인터의 점선이 생겨 나게 됩니다  그리고 서클을 선택하면 됩니다 

 

 

카메라가  로봇중심에 오지 않으면 서클을 선택하고 회전시켜서 카메라가 로봇의 정면에 있도록 합니다 

 

카메라 뷰에서  타임라인의 플레이 버튼을 누르고  카메라가 서클에 따라 회전하는지 확인합니다 

 

 

메뉴창에서 Rendering  -> Render Setup  을 열고 프레임과 동영상 크기를 설정하여 AVI 파일로 영상을 출력합니다 

 

반응형
반응형

 

1. 프리미어 프로에서 파일 불러오기 

 

프리미어 프로 2020을 컴퓨터에 깔고  프로젝트를 생성하면 아래 그림과 같이 미디어 파일을 편집할 수 있는 환경의 창이 나오게 됩니다 

먼저 파일을 불러올려면 File -> Import를 선택하면 편집할 미디어 파일을 불러올 수 있게 됩니다 

 

 

Project창에 미디어 파일을 불러온 모습

 

 

 

2. 프리미어 프로 에서 영상 자르고 음향 파일 지우기 및 미디어 파일 붙이기 

 

Project 창의 미디어를 드래그 드랍으로 타임라인창에 올려 놓습니다

Razor Tool 을 선택하여 영상 파일을 자르고 Seclection Tool 로 이동시킬 수 있습니다 

 

만약 영상파일에 음향파일을 지우려면 해당 영역의 영상을 선택한 후 오른쪽 마우를 클릭하고 Unlink를 클릭하면 영상파일과 음향 파일을 각각 선택할 수 있게 됩니다,

그리고 해당 파일을 선택하여 없애려면 DEL 키를 누르면 삭제할 수 있습니다 

 

해당 자른 영상에서 음향 파일만 없앤 부분

 

Seclection Tool을 이용하여 자른 파일을 이동할 수 있습니다 

 

이동한 파일을 다시 정확한 끝에 붙이려면  Seclection Tool을 선택하고 빈 공간을 선택한 뒤 마우스 오른쪽 클릭-> Ripple Delete를 선택하면 됩니다 

 

미디어 파일이 길거나 짧게 보일 경우 타임라인 아래의 슬라이더를 움직이며 편집환경을 조절 합니다  

 

 

 

 

3. 프리미어 프로에서 음향 볼륨 조절하기 

 

미디어 파일의 선택한 부분의 볼륨을 조절하려면  

 

Effect Controls 창을 열고  fx Volume -> Level 클릭한후  수치를 조절하면 됩니다 

 

 

 

 

4. 프리미어 프로에서 글자 넣기 및 텍스쳐 조절 하기 

 

화면에 텍스쳐를 넣으려면 Tpye Tool를 선택합니다 

 

텍스쳐가 들어갈 화면에 글자를 써넣습니다 

 

타임라인에 텍스쳐 라인을 조절 합니다 

 

텍스쳐라인을 선택하고 Effect Controls 창을 열고 Text 부분에서 font와 크기 색깔을 선택할 수 있습니다 

 

 

 

5. 프리미어 프로에서 영상 출력하기 

 

편집한 영상을 마무리하면 최종 영상파일로 만들어야 합니다 

File -> Export -> Media를 클릭합니다 

 

대부분 MP4 파일 영상을 만들기 때문에 

Format -> H.264를 선택하고  Output을 선택하여 Expot를 클릭하면 영상이 만들어집니다 

 

반응형
반응형

이번 시간에는 게임 뷰에 점수를 보이게 하겠습니다

먼저 Hierarchy 뷰에서 마우스 오른쪽 버튼을 클릭하고   UI -> Text를 생성합니다 

그러면 Hierarchy 뷰에서 Canvas 가 생성됩니다 

Canvas 를 선택하고  UI Scale Mode -> Scale With Screen Size , Reference Resolution  1080 1920 , Match 0.5에 맞춥니다 

 

Canvas 자식으로 있는 Text 의 이름을 ScoreText로 바꾸고 ScoreText를 선택하여 Center를 클릭한 다음 아래 사진처럼 top 중앙에 올 수 있도록 합니다 

 

그리고 Canvas 를 클릭하고 마우스 오른쪽을 클릭하고 Create Empty 하여 GameObject를 생성한 다음 이름을 GameUI로 고친 후 ScoreText를 자식으로 놓습니다 

GameManager 스크립트를 수정합니다 

 

점수 Text 를 넣을 수 있는 네임스페이스(using UnityEngin.UI)를 추가하고 변수에 int score = 0 , pulic Text scoreText 추가 GameStart() 함수에 gameUI.SetActive(true)   StartCoroutine(UpdateScore()) 추가

 IEnumerator UpdateScore()
    {
        //1초 지날때 마다 1점씩 올라간다 
        while (true)
        {
            yield return new WaitForSeconds(1f);
            score++;

            scoreText.text = score.ToString();
        }
    }

 

추가 합니다 

 

반응형

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;


public class GameManager : MonoBehaviour
{
    public static GameManager instance;

    //
    public GameObject platformSpawner;

    public GameObject gameUI;

    public bool gameStarted;

    int score = 0;

    public Text scoreText;

    private void Awake()
    {
        if (instance == null)
        {
            instance = this;
        }
    }

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        if (!gameStarted)
        {
            //마우스 클릭하면 차가 움직인다 
            if (Input.GetMouseButtonDown(0))
            {
                GameStart();
            }
        }
    }

    public void GameStart()
    {
        gameStarted = true;
        //platformSpawner 스크립트를 실행
        platformSpawner.SetActive(true);

        gameUI.SetActive(true);
        StartCoroutine(UpdateScore());
    }


    public void GameOver()
    {
        //platformSpawner 스크립트를 없앤다
        platformSpawner.SetActive(false);

        //1초후 게임재시작 함수에 전달 
        Invoke("ReloadGame",1);
    }

    //게임재시작
    void ReloadGame()
    {
        SceneManager.LoadScene("Game");
    }

    IEnumerator UpdateScore()
    {
        //1초 지날때 마다 1점씩 올라간다 
        while (true)
        {
            yield return new WaitForSeconds(1f);
            score++;

            scoreText.text = score.ToString();
        }
    }
}

 

Hierarchy 뷰에서 Canvas 자식으로 있는 GameUI를 끄고 GameManager를 선택하여 GameUI와 ScoreText를 연결합니다 

 

게임을 실행하여 점수가 올라가는지 확인합니다 

 

반응형
반응형

이번 시간에는 게임이 끝나면 게임을 재시작하는 스크립트를 짜고 3D 게임에서 오브젝트를 밝게 비추는 라이트를 고정해 놓는 작업을 하겠습니다

 

먼저 Hierarchy 뷰에서 GameManager 오브젝트를 선택하여 GameManager 스크립트를 열고 스크립트를 수정합니다 

 

 

반응형

 

GameManager 스크립트 수정

 

스크립트를 열고 네임스페이스 부분에서

using UnityEngine.SceneManagement;

를 추가합니다 

그리고 ReloadGame() 함수를 추가하여 GameOver() 함수에서 실행하는 명령을 추가합니다 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class GameManager : MonoBehaviour
{
    public static GameManager instance;

    //
    public GameObject platformSpawner;

    public bool gameStarted;

    private void Awake()
    {
        if (instance == null)
        {
            instance = this;
        }
    }

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        if (!gameStarted)
        {
            //마우스 클릭하면 차가 움직인다 
            if (Input.GetMouseButtonDown(0))
            {
                GameStart();
            }
        }
    }

    public void GameStart()
    {
        gameStarted = true;
        //platformSpawner 스크립트를 실행
        platformSpawner.SetActive(true);
    }


    public void GameOver()
    {
        //platformSpawner 스크립트를 없앤다
        platformSpawner.SetActive(false);

        //1초후 게임재시작 함수에 전달 
        Invoke("ReloadGame",1);
    }

    //게임재시작
    void ReloadGame()
    {
        SceneManager.LoadScene("Game");
    }
}

 

 

게임을 재시작 할려면 신을 추가하여야 합니다 

File -> Build Settings 를 열고 Game 신을 추가합니다 

 

게임을 재시작하면 라이트가 꺼지는 현상을 보게 될것입니다 

그래서 라이트를 고정할려면 라이트맵을 만들어야 합니다 

Window -> Rendering -> Lighting에 들어갑니다 

 

 

 

Lighting  탭에서 맨 마지막에  Generate Lighting 을 클릭합니다 

 

라이트 맵이생성되었습니다 

 

게임을 실행하여 1초후 게임이 재실행되고 라이트가 고정되었는지 확인합니다 

 

 

반응형
반응형

이번에는 자동차가 도로에서 벗어나면 자동차가 떨어지고 게임이 끝나는 시연을 하겠습니다

 

먼저 Hierarchy뷰에서 car1을 선택하고 is Kinematic을 체크 해저 합니다 

is Kinematic을 해제하면 자동차가 중력의 영향을 받게 됩니다 

 

CarCtrl스크립트를 수정합니다 

 

Update() 함수에

     if (transform.position.y <= -2)
        {
            GameManager.instance.GameOver();
        }

항목을 추가합니다 

car1 이 중력을 받고 떨어지면 게임을 끝내는 GameOver() 함수를 실행합니다 

 

 

 

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CarCtrl : MonoBehaviour
{
    public float moveSpeed;
    bool sideMoving = true;
    bool firstInput = true;

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        if (GameManager.instance.gameStarted)
        {
            Move();
            CheckInput();
        }

        //자동차가 중력을 받고 떨어졌을때 y 값이 떨어지면 게임오버실행
        if (transform.position.y <= -2)
        {
            GameManager.instance.GameOver();
        }
    }

    void Move()
    {
        //물체의 z축 방향(forward)으로 moveSpeed 만큼 시간 프레임에 곱해준다 
        transform.position += transform.forward * moveSpeed * Time.deltaTime;
    }


    void CheckInput()
    {
        //첫 클릭은 무시하고 리턴한다 
        if (firstInput)
        {
            firstInput = false;
            return;
        }


        //마우스를 왼쪽버튼 클릭하면
        if (Input.GetMouseButtonDown(0))
        {
            ChangeDirection();
        }
    }
    void ChangeDirection()
    {
        //sideMoving 참일때  
        if (sideMoving)
        {
            sideMoving = false;

            //y축 방향으로 90도 회전한다
            transform.rotation = Quaternion.Euler(0, 90, 0);
        }
        else
        {
            sideMoving = true;
            transform.rotation = Quaternion.Euler(0, 0, 0);
        }
    }
}

 

 

 

GameManager스크립트를 수정합니다 

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameManager : MonoBehaviour
{
    public static GameManager instance;

    //
    public GameObject platformSpawner;

    public bool gameStarted;

    private void Awake()
    {
        if (instance == null)
        {
            instance = this;
        }
    }

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        if (!gameStarted)
        {
            //마우스 클릭하면 차가 움직인다 
            if (Input.GetMouseButtonDown(0))
            {
                GameStart();
            }
        }
    }

    public void GameStart()
    {
        gameStarted = true;
        //platformSpawner 스크립트를 실행
        platformSpawner.SetActive(true);
    }


    public void GameOver()
    {
        //platformSpawner 스크립트를 없앤다
        platformSpawner.SetActive(false);
    }
}

 

GameManager 스크립트를 수정하고 GameManager스크립트 PlatformSpawner 빈 공간에 PlatformSpawner 오브젝트를 연결합니다 

 

 

 

Hierarchy뷰에서 PlatformSpawner 오브젝트를 선택하고 Inspector를 체크 해제합니다 

 

Main Camera를 선택하여 CameraFollow 스크립트를 수정합니다 

 

 

Update() 함수 부분을 수정하여 

      if (target.position.y >= 0)
        {
            Follow();
        }

 

자동차가 y값이 0 이상일 때만 따라 움직이게 합니다 

 

 

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraFollow : MonoBehaviour
{
    public Transform target;

    Vector3 distance;
    public float smoothValu;

    // Start is called before the first frame update
    void Start()
    {
        // 카메라와 타겟 자동차와의 거리
        distance = target.position - transform.position;
    }

    // Update is called once per frame
    void Update()
    {
        //자동차가 떨어지지 않으면 Follow()실행, 떨어지면 카메라가 움직이지 않는다 
        if (target.position.y >= 0)
        {
            Follow();
        }

       
    }

    void Follow()
    {
        //현재 카메라 포지션
        Vector3 currentPos = transform.position;

        //현재 타겟 자동차 
        Vector3 targetPos = target.position - distance;

        //currentPos(카메라)가 targetPos(자동차)을 smoothValu 만큼 time 프레임에 맞쳐 뒤따라간다
        transform.position =  Vector3.Lerp(currentPos, targetPos, smoothValu * Time.deltaTime);


    }
}

 

 

 

 

Platform 스크립트를 생성합니다 

 

Prefab 폴더의 PlatformP 프리 팹을  선택하고 Plaform 스크립트를 연결합니다

 

 

 

Platform 스크립트 작성

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Platform : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        

    }

    // Update is called once per frame
    void Update()
    {
        
    }

    private void OnCollisionExit(Collision collision)
    {

        //Player태그를 가진 오브젝트와 닿았을때  0.2초후 Fall()실행
        if (collision.gameObject.tag == "Player")
        {
            Invoke("Fall", 0.2f);
        }
    }
    void Fall()
    {
        //중력의 영향을 받고 물체를 떨어진다  그리고 1초후 삭제 
        GetComponent<Rigidbody>().isKinematic = false;
        Destroy(gameObject, 1f);
    }
}

 

 

 

 

car1 오브젝트를 선택하고 Inspector에서 Tag -> Player를 줍니다 

 

 

게임을 실행하여 도로블록이 자동차가 지나갔을 때 아래로 떨어지고 자동차가 도로에서 벗어나면 자동차가 중력을 받고 떨어지고 블록 생성이 중단되는지 확인합니다 

 

반응형
반응형

자동차의 시점을 따라가도록 카메라의 스크립트를 달아 자동차를 따라가게 하고 자동차의 도로 역할을 하는 사각 블록을 자동으로 생성되는 스크립트를 만들어보겠습니다

 

 

Hierarchy 뷰에 Create Empty 를 만들어서  이름을 PlatformSpawner로 합니다 

 

Scripts폴더에 PlatformSpawner 스크립트를 생성하고 스크립트작성할 준비를 합니다 

 

 

 

 

PlatformSpawner 오브젝트의 PlatformSpawner 스크립트를 붙힙니다 

 

 

 

PlatformSpawner 스크립트작성

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlatformSpawner : MonoBehaviour
{
    public GameObject platform;

    public Transform lastPlatform;
    Vector3 lastPosition;
    Vector3 newPos;


    bool stop;
    // Start is called before the first frame update
    void Start()
    {
        lastPosition = lastPlatform.position;

        StartCoroutine(SpawnPlatforms());

    }

    // Update is called once per frame
    void Update()
    {

  



        //if (Input.GetKey(KeyCode.Space))
        //{
        //    SpawnPlatforms();
        //}
    }

    IEnumerator SpawnPlatforms()
    {

        while (!stop)
        {
            GeneratePosition();

            //마지막플랫폼블럭위치에 newPos만큼 새로운 플랫폼블럭을 생성한다
            Instantiate(platform, newPos, Quaternion.identity);

            lastPosition = newPos;

            yield return new WaitForSeconds(0.1f);
        }


    }

    //void SpawnPlatforms()
    //{
    //    GeneratePosition();


    //    //마지막플랫폼블럭위치에 newPos만큼 새로운 플랫폼블럭을 생성한다
    //    Instantiate(platform, newPos, Quaternion.identity);
        
    //    lastPosition = newPos;
    //}

// 랜덤으로 lastPosition 값을 x,y 값 2만큼 움직이게 한다 
    void GeneratePosition()
    {
        newPos = lastPosition;

        int rand = Random.Range(0, 2);

        if (rand > 0)
        {
            newPos.x += 2f;
        }
        else
        {
            newPos.z += 2f;
        }

    }
}

 

 

 

 

 

Hierarchy뷰에서  PlatformSpawner 오브젝트를 선택하고 작성한 PlatformSpawner 스크립트 공백에 Platform 에는 프리 팹으로 넣은 PlatformP 프리 팹을 넣어주고, Last Platform 에는 박스 오브젝트 복사 모듈인 PlatformP (3)을 넣어줍니다

 

 

자동차의 움직임을 자연스럽게 카메라를 따라가는 스크립트를 만듭니다

Main Camera를 선택하고 CameraFollow 스크립트를 생성하여 Main Camera에 붙입니다 

 

 

 

CameraFollow 스크립트 작성

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraFollow : MonoBehaviour
{
    public Transform target;

    Vector3 distance;
    public float smoothValu;

    // Start is called before the first frame update
    void Start()
    {
        // 카메라와 타겟 자동차와의 거리
        distance = target.position - transform.position;
    }

    // Update is called once per frame
    void Update()
    {
        Follow();
    }

    void Follow()
    {
        //현재 카메라 포지션
        Vector3 currentPos = transform.position;

        //현재 타겟 자동차 
        Vector3 targetPos = target.position - distance;

        //currentPos(카메라)가 targetPos(자동차)을 smoothValu 만큼 time 프레임에 맞쳐 뒤따라간다
        transform.position =  Vector3.Lerp(currentPos, targetPos, smoothValu * Time.deltaTime);


    }
}

 

 

 

 

Main Camera를 선택하고  CameraFollow 스크립트 빈칸에 Target -> car1, smoothValu 5를 줍니다 

게임을 실행하여 자동차 움직임의 시점을 따라가는지 확인하고  자동차 도로의 블록이 자동으로 생성되는지 확인합니다

 

 

3D Game 자동차 게임 지그재그 게임만들기 4 로 이동

 

반응형
반응형

스크립트를 작성하여 자동차를 움직여 보겠습니다 

 

Scripts 폴더에 CarCtrl 스크립트를 만들고  car1 오브젝트에 붙입니다  

그리고 잠시 Rigdbody 에서 is Kinematic을 체크합니다 

 

 

 

 

 

 

 

CarCtrl 스크립트 작성

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CarCtrl : MonoBehaviour
{
    public float moveSpeed;
    bool sideMoving = true;
    bool firstInput = true;

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        if (GameManager.instance.gameStarted)
        {
            Move();
            CheckInput();
        }

    }

    void Move()
    {
        //물체의 z축 방향(forward)으로 moveSpeed 만큼 시간 프레임에 곱해준다 
        transform.position += transform.forward * moveSpeed * Time.deltaTime;
    }


    void CheckInput()
    {
        //첫 클릭은 무시하고 리턴한다 
        if (firstInput)
        {
            firstInput = false;
            return;
        }


        //마우스를 왼쪽버튼 클릭하면
        if (Input.GetMouseButtonDown(0))
        {
            ChangeDirection();
        }
    }
    void ChangeDirection()
    {
        //sideMoving 참일때  
        if (sideMoving)
        {
            sideMoving = false;

            //y축 방향으로 90도 회전한다
            transform.rotation = Quaternion.Euler(0, 90, 0);
        }
        else
        {
            sideMoving = true;
            transform.rotation = Quaternion.Euler(0, 0, 0);
        }
    }
}

 

 

 

 

 

 

 

 

 

Move Speed 8을 넣습니다 

그리고 GameManager 스크립트를 만듭니다 

 

Hierachy 뷰에서 GameManager 오브젝트를 만들고 GameManager 스크립트를 붙입니다 

 

 

 

 

 

 

 

 

GameManager 스크립트 작성

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameManager : MonoBehaviour
{
    public static GameManager instance;

    public bool gameStarted;

    private void Awake()
    {
        if (instance == null)
        {
            instance = this;
        }
    }

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        if (!gameStarted)
        {
            //마우스 클릭하면 차가 움직인다 
            if (Input.GetMouseButtonDown(0))
            {
                GameStart();
            }
        }
    }

    public void GameStart()
    {
        gameStarted = true;
    }


    public void GameOver()
    {
       
    }
}

 

 

 

 

 

 

 

 

 

 

게임을 실행시키고 자동차가  마우스를 클릭하였을때 움직이고 방향이 바뀌는지 확인합니다 

 

 

3D Game 자동차 게임 지그재그 게임 만들기 3

 

 

반응형
반응형

3D 자동차 게임 만들기

자동차가 순간 맞추어지는 도로에 따라 지그재그 움직이는 게임입니다 

 

 

 

가로 뷰로 게임을 실행하므로 

유니티 엔진의 Game 뷰를 1080 X 1920  맞춥니다

 

씬 이름을 Game으로 바꿉니다 

 

메인 카메라를 선택하고 Clear Flags를 Solid Color로 바꿉니다

그리고 Background 색깔을 각자 분위기에 맞게 색깔을 지정합니다

저는 푸른색으로 바꾸었습니다 

 

 

 

 

 

 

Hierarchy 뷰에서  GameObject ->Cube를  생성합니다 

Cube가 Game 뷰에서 생성된 모습을 볼 수 있습니다 

 

 

GameObject 인 Cube의 이름을 Platform이라 하고  Inspector 메뉴에서 Scale 4,1,4로 바꿉니다 

 

 

Main Camera를 선택하고  Scene뷰에서  Platform 오브젝트를 대각선 방향으로 윗면이 보이게 아래 그림처럼 방향을 설정하고  GameObjet-> Align With View를 선택하면 Scen 뷰에서 방향을 맞춘 Camera 방향이 Game 뷰에 맞추어지게 됩니다 

 

그리고 Main Camera를 선택하고 Inspector 메뉴에서 Projection -> Orthographic  

Size -> 7에 맞춥니다  

 

hierarchy에서  Platform을 복사하여 새로운 Platform을 만들고 위치를 z 3 만큼 움직이고 Scale 2,1,2 

를 맞추고 BoxCollider를 생성하고 RigidBody 생성하여  Is Kinematic 체크합니다 

 

 

 

 

그리고  복사한 Platform의 이름을 PlatformP로 바꾸고 Project  Assets 폴더에서  Prefab 폴더를 생성하고 PlatformP를 저장합니다 

 

PlaformP 오브젝트를 3개 더 복사하여 Z 간격을 각각 2 만큼씩 띄웁니다 

 

 

 

car1.FBX
0.04MB

 

car1 FBX 파일을 다운로드하여 유니티 엔진의 Project Assets의 Models 폴더를 만들고 car1 파일을 저장합니다 

 

 

 

 

다운로드한 car1 파일을 선택하고 Model -> Scale Factor 0.01을 합니다 

 

 

Models 파일에 있는 car1 파일을 드래그하여 Hierarchy 뷰 에 갖다 놓고 Scale 0.5 ,0.5, 0.5에 맞춥니다 

 

 

 

car1을 선택하고  Rigidbody 추가하고 BoxCollider를 추가합니다 

 

 

 

게임만들기 2편 보기

 

 

 

반응형
반응형

3DS MAX 게임 로봇 로우 폴리 모델링을 하였습니다 

3DS MAX 2018로 모델링하였으며 최대한 폴리곤 개수를 줄일 여고 했습니다 

폴리곤 갯수 3,672개

버텍스 갯수 3,798개

맥스에서 폴리곤 개수를 보려면 단축키 7을 누르면 나옵니다 

로봇의 각 관절을 메카닉 개념으로 쉽게 움직일수 있도록 모델링하였습니다 

 

원격조종 초합금형 공격형 로봇 (KAR-100)

길이 : 10M

무게 : 50톤

지상 이동 속도 :  200 KM/H

공중 속도 : 마하 3

레이다 : 주 야간 500kM  저피탐 항체 탐지용 고출력 고감도 표적 탐지 레이더

무장: 광전자 레이져건, 눈에서 나오는 고출력 광 레이저, 투구에서 나오는 번개 레이저, 광전류 검

 

FRONT

 

 

 

 

BACK

 

 

 

반응형
반응형

포토샵에서 작업한 적 캐릭터 이미지를 유니티에 끌어다 Textrue폴더에 넣습니다 

그리고 아래 그림과 같이 그림 Inspector를 바꿉니다 

그리고 Sprite Editor에 들어감니다 

 

Slice를 누르고 Automatic 으로 그림을 나눕니다

그리고 Pivot을 나중에 캐릭터가 움직임에 원활히 할수있도록 위치를 조종합니다  

 

 

 

 

 

빈오브젝트를 만들고 이름을 Enemy 하고 Enemy그림파일을 각각 관절에 맞게 Hierarchy 창에 끌어다 놓고 그림을 인간형에 맞게 맞춥니다 

 

Enemy의 각각의 관절에 Sorting Layer -> Enemy 를 만들고 그림이 위아래가 바뀌지 않도록 합니다 

 

 

 

 

 

Enemy 오브젝트의 Window -> animation -> animation 을 열고 Create new Clip을 Enemy_Run을 만들고 적 캐릭터가 움직이는 애니메이션을 만듭니다 

 

 

Enemy 스크립트를 생성하고 작성합니다 

 

 

 

 

Enemy 스크립트 작성 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Enemy : MonoBehaviour
{

    //적캐릭터의 생명카운트
    public int health;

    //Player 위치
    [HideInInspector]
    public Transform player;

    //스피드
    public float speed;

    //공격과 재공격의 시간 
    public float timeBetweenAttacks;
    // 데미지
    public int damage;
    private void Start()
    {
        //Player tag 오브젝트를 찾는다
        player = GameObject.FindGameObjectWithTag("Player").transform;
    }

    //공격을 받을때 생명이 줄어드는 함수
    public void TakeDamage(int damageAmount)
    {
        health -= damageAmount;
        if (health <= 0)
        {
            Destroy(gameObject);
        }
    }
}

 

 

 

 

 

 

Enemy 오브젝트를 선택하고 Enemy 스크립트를 붙히고 Tag에 Enemy를 생성하고  Box Collider2 D를 붙이고 isTrigger를 체크하고 Rigidbody2 D에서 Gravity scale을 0으로 하고 Freeze Rotation -> z를 체크합니다 

 

Prefabs에 있는 bullet 프리팹을 선택하여 BulletCtrl 스크립트를 수정합니다 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BulletCtrl : MonoBehaviour
{
    public float speed;
    public float lifeTime;
    public GameObject explosion;

    public int damage;
   
   
    void Start() 
    {
        // 총알을 시간에 맞게 지운다
        //Destroy(gameObject, lifeTime);
        Invoke("DestroyBullet", lifeTime);
    } 
      void Update() 
    { 
        // 시간프레임과 speed에 따라 y축방향으로 움직인다
        transform.Translate(Vector2.up * speed * Time.deltaTime); 
    }

    //총알을 삭제하고 이팩트를 생성한다 
    void DestroyBullet()
    {
        Destroy(gameObject); 
        Instantiate(explosion, transform.position, Quaternion.identity);
    }

    private void OnTriggerEnter2D(Collider2D collision)
    {
        //적캐릭터 오브젝트와 닿게 되면 이팩트를 생성하고 적캐릭터 함수에 전달하여 생명을 감소시킨다 
        if (collision.tag == "Enemy")
        {
            collision.GetComponent<Enemy>().TakeDamage(damage);
            Instantiate(explosion, transform.position, Quaternion.identity);
            DestroyBullet();
        }
    }


}

 

 

 

 

bulletCtrl 스크립트를 수정하고 Explosion  -> Particle System  speed 20 , LifeTime 3 , Damage1을 넣습니다  

 

 

 

Player 오브젝트를 선택하고 Tag  -> Player를 선택합니다  그리고 player 스크립트를 수정합니다

그리고 Game 을 실행시키면 Enemy 가 총알에 맞고 Enemy Health가 0 이 되면 Enemy가 삭제되는 것을 확인할 수 있습니다  

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
    public float speed;
    private Rigidbody2D rigid;
    private Vector2 moveAmount;
    private Animator anim;

    public float health;

    private void Start() 
    { 
        rigid = GetComponent<Rigidbody2D>();
        anim = GetComponent<Animator>();
    }
    private void Update()
    { 
        //키보드(WSAD)의 좌우상하를 방향을 정의해 준다
        Vector2 moveInput = new Vector2(Input.GetAxisRaw("Horizontal"), 
            Input.GetAxisRaw("Vertical")); 
        //움직임방향에 속도를 곱한다
        moveAmount = moveInput.normalized * speed;

    //키보드를 누르면 Player 애니메이터 파라미터를 적용하고 캐릭터를 움직인다
      if (moveInput != Vector2.zero) 
        { 
            anim.SetBool("Run", true); 
        } else 
        { 
            anim.SetBool("Run", false); 
        }

    
    }
    
    private void FixedUpdate() 
    { //움직임 방향에 시간에 따라 리지드 바디 포지션값을 더한다
      rigid.MovePosition(rigid.position + moveAmount * Time.fixedDeltaTime); 
    }

    // Player의 체력을 감소 시킨다
    public void TakeDamage(int damageAmount)
    {
        health -= damageAmount;
        if (health <= 0)
        {
            Destroy(gameObject);
        }
    }
}

    

 

 

 

 

Enemy 오브젝트를 선택하고 Enemy 스크립트를 오브젝트에서 삭제 하고 MeleeEnemy 스크립트를 작성합니다 

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MeleeEnemy : Enemy
{
    public float stopDistance;

    private float attackTime;

    public  float attackSpeed;
    private void Update()
    {
        if (player != null)
        {
            //Enemy가 Player의  stopDistance 거리 밖이라면 Player 방향으로 speed 속도로 돌진한다 
            if (Vector2.Distance(transform.position,player.position ) > stopDistance) 
            {
                transform.position =
                    Vector2.MoveTowards(transform.position, player.position, speed * Time.deltaTime);
            }
            else
            {
                //Enemy가 Player의  stopDistance 거리 안쪽에 있으면 attackTime의 딜레이를 주고 공격한다 
                if (Time.time >= attackTime)
                {
                    StartCoroutine(Attack());
                    attackTime = Time.time + timeBetweenAttacks;
                }

            }
        }
    }

    // 적캐릭터의 공격
    IEnumerator Attack()
    {
        player.GetComponent<Player>().TakeDamage(damage);

        Vector2 originalPosition = transform.position;
        Vector2 targetPosition = player.position;

        float percent = 0;

        // 한번 공격할때 공격 가속도와 치고 빠지기를 반복한다 
        while (percent <= 1)
        {
            percent += Time.deltaTime * attackSpeed;
            float formula = (-Mathf.Pow(percent, 2) + percent) * 4;
            transform.position = Vector2.Lerp(originalPosition, targetPosition, formula);
            yield return null;
        }
    }
}

 

 

 

 

 

Enemy 오브젝트의 MeleeEnemy 스크립트를 붙힘니다 

그리고 Health 2 , speed 5 , timeBetweenAttacks 2, damage 1, stopDistance 3, attackSpeed 8을 넣습니다  

 

Inspector 창에서 Player,Enemy 레이어를 추가합니다 

 

 

 

 

 

 

Edit -> ProjectSettings -> Phsics2D  에서 아래 그림과 같이

플레이어 레이어가있는 오브젝트와 적 레이어가 있는 오브젝트가 더 이상 서로 충돌하지 않기 때문에 체크 해제 합니다 

 

 

 

 

 

게임을 실행하면 적 캐릭터가 Player를 따라 다니면서 공격하는 것을 볼 수 있습니다 

Enemy_sheet.png
0.12MB

반응형
반응형

주위 배경을 위해서 Background 텍스쳐 파일을 하이 라키 뷰에 올리고 중앙에 맞춥니다 

그리고 텍스쳐 스케일을 카메라뷰보다 넓게 4,4,1로 맞춥니다  

 

 

새로운 오브젝트를 생성하고 이름을 CameraFollow 라 합니다 

 

CameraFollow 오브젝트의 자식으로 Main Camera를 옮겨다 놓습니다 

CameraFollow 스크립트를 작성합니다 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraFollow : MonoBehaviour
{
    //Player 포지션 
    public Transform playerTransform;

    public float speed;

    public float minX;
    public float maxX;
    public float minY;
    public float maxY;


    // Start is called before the first frame update
    void Start()
    {
        //Player 포지션을 가지고 온다 
        transform.position = playerTransform.position;
    }

    // Update is called once per frame
    void Update()
    {
        if (playerTransform != null)
        {
            //화면의 X축의 최대점과 최소점을 넘지않게 설정
            float clampedX = Mathf.Clamp(playerTransform.position.x, minX, maxX);
            //화면의 Y축의 최대점과 최소점을 넘지않게 설정
            float clampedY = Mathf.Clamp(playerTransform.position.y, minY, maxY);

            //카메라를 clampedX,clampedY 방향으로 speed 속도를 부드럽게 이동
            transform.position = Vector2.Lerp(transform.position,new Vector2(clampedX,clampedY), speed);
        }
        
    }
}

 

 

Player 오브젝트를 드래그하여 Player Transform 빈 공간에 드래그하여 붙이고 speed를 0.12  정도 합니다 

 

CameraFollow오브젝트를 X 쪽으로 -11 만큼 움직입니다 카메라가 배경 보이는 끝선에 맞춤니다 

그리고 Min X 에 -11을 넣습니다 

 

 

CameraFollow를 x축으로 그림영역 최댓값에 맞추고  MaxX를 11을 넣습니다 

 

CameraFollow를 y축으로 그림영역 최솟값에 맞추고  MinY를 -7을 넣습니다 

CameraFollow를 y축으로 그림영역 최댓값에 맞추고  MaxY를 5를 넣습니다 

 

 

하이라키뷰에 Stoper오브젝트 4개를 생성합니다 

 

Stoper 오브젝트에 BoxCollider2D를 붙이고 각각 위치를 배경 끝에 놓습니다 

 

 

Player 오브젝트에 BoxCollider2D 를 붙입니다 

게임을 실행하여 Player의 움직임에 Camera가 따라가고 배경의 보이는 부분까지만 Player가 제한되는 움직임을 보입니다 

 

 

반응형
반응형

포토샵에서 여러 가지 모양을 하얀색으로 그립니다 

바탕을 투명으로 하고 png 파일로 저장합니다 

ㅗㅗ

 

유니티에 Texture 폴더에 저장합니다 

 

 

 

particle 텍스쳐를 선택하고 아래와 같이 속성을 바꾸어줍니다 

그리고 Sprite Editor 를 클릭합니다 

Slice를 누르고 Type을  Automatic으로 하고 Slice 합니다  

 

 

Hierarchy 뷰에서 마우스 오른쪽 버튼을 누르고 Effects -> Paticle System을 생성합니다 

 

 

 

 

생성된 파티클 오브젝트를 선택하고 Rotation 을 0 ,0, 0으로 잡고  Paticle System 속성을 아래 그림과 같이 만듭니다 

 

 

 

Texture 폴더에 저장하였던 그림파일을  Texture Sheet Animation 에 Sprites에 하나씩 대입합니다 

 

Sorting Layer ID 를 새로 만들고 이름을 Effect로 하고 아래 그림과 같이 맨 마지막 위치에 레이어를 놓습니다 

 

 

 

Play  하면 아래 동영상과 같이  이팩트가 터지는 모습을 볼수있습니다 

Particle.unitypackage
0.13MB

반응형
반응형

 

Gun 오브젝트를 선택하고 총알이 나올 수 있는 포인트를 만들어 주어야 합니다 

그래서 새로운 오브젝트를 Create Empty 를 생성하고 자식으로 이름을 sPoint라고 합니다 

GunCtrl 스크립트 수정

아래와 같이 GunCtrl 스크립트를 수정합니다 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GunCtrl : MonoBehaviour
{
    public GameObject bullet;
    public Transform sPoint;
    public float timeBetweenShots;


    private float shotTime;

    void Update()
    {
        //카메라 스크린의 마우스 거리와 총과의 방향 
        Vector2 direction = Camera.main.ScreenToWorldPoint(Input.mousePosition) - transform.position;
        //마우스 거리로 부터 각도 계산
        float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
        //축으로부터 방향과 각도의 회전값
        Quaternion rotation = Quaternion.AngleAxis(angle , Vector3.forward);
        transform.rotation = rotation;

        //마우스 왼쪽버튼을 눌렀을때
        if (Input.GetMouseButton(0))
        {
            if (Time.time >= shotTime)
            {
                //총알을 생성한다
                Instantiate(bullet, sPoint.position, Quaternion.AngleAxis(angle - 90,Vector3.forward));
                //재장전 총알 딜레이 
                shotTime = Time.time + timeBetweenShots;
            }
        }
    }
}

 

 

 

 

수정된 GunCtrl 스크립트에 프리팹으로 만들었던 bullet과 Gun 오브젝트의 자식으로 있는 sPoint를 GunCtrl스크립트에 연결합니다 

 

아래 동영상과 같이 총알이 나오는 것을 볼 수 있습니다 

 

bullet 프리팹을 선택하여 BulletCtrl 스크립트를 생성하고 작성합니다 

 

 

 

 

BulletCtrl 스크립트를 작성합니다 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BulletCtrl : MonoBehaviour
{
    public float speed;
    public float lifeTime;

    // Start is called before the first frame update
    void Start()
    {
        // 총알을 시간에 맞게 지운다 
        Destroy(gameObject, lifeTime);
    }

    // Update is called once per frame
    void Update()
    {
        // 시간프레임과 speed에 따라 y축방향으로 움직인다 
        transform.Translate(Vector2.up * speed * Time.deltaTime);
    }
}

 

 

아래 동영상과 같이 마우스에 따라 총이 움직이고 총알이 마우스에 따라 방향대로 발사되는 것을 확인합니다 

 

반응형
반응형

그림파일을 Texture 폴더에 끌어 옮겨 저장합니다 

 

Gun 텍스쳐타입을 아래 그림과 같이 바꿉니다 

 

 

 

 

Gun 그림파일의 속성에서 Sprite Editor를 들어가서 Pivot 점을 방아쇠 근처로 옮깁니다 

 

Gun 텍스쳐를 Hierachy 에 옮기고  Gun 오브젝트를 선택하여 Sorting Layer를 하나 만들고 order in Layer 1로 합니다 

 

bullet 텍스쳐를 Hierachy로 옮기고 SortingLayer를 Bullet을 만들고 Order in Layer 1로 합니다 

 

 

 

 

Prefabs 폴더를 만들고 드래그하여 프리팹을 만듭니다 

 

Gun 오브젝트를 Player 자식으로 옮기고 Gun 오브젝트에 GunCtrl 스크립트를 생성하여 작성합니다 

 

 

 

 

GunCtrl 스크립트를 작성합니다 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GunCtrl : MonoBehaviour
{

    void Update()
    {
        //카메라 스크린의 마우스 거리와 총과의 방향 
        Vector2 direction = Camera.main.ScreenToWorldPoint(Input.mousePosition) - transform.position;
        //마우스 거리로 부터 각도 계산
        float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
        //축으로부터 방향과 각도의 회전값
        Quaternion rotation = Quaternion.AngleAxis(angle, Vector3.forward);
        transform.rotation = rotation;
    }
}

 

 

 

 

 

게임을 실행 시키고 아래 동영상과 같이 마우스 움직임에 따라 총이 움직이는 것을 확인합니다 

Texture2.zip
0.04MB

반응형
반응형

포토샵에서 Player로 사용할 캐릭터를 각 관절을 나눈 후에 파일을 저장합니다 

왜냐하면 그림파일을 유니티에 옮긴 후에 캐릭터를 움직이는 애니메이션을 주기 위함입니다 

그림파일을 PNG 파일로 저장합니다 

 

 

유니티 새프로젝트를 만들고 Assets에 폴더 이름을 Texture 라 하고 그림파일을 임포트 합니다

그림파일을 드래그 하셔서 옮기셔도 파일이 Texture파일에 들어가게 됩니다 

 

 

 

 

 

 

 

그림파일을 안드로이드 환경에서 작업하기 위해서는 그림 파일 설정을 해 주어야 합니다 

아래 그림과 같이 설정값을 바꾸고 Sprite Editor에 들어갑니다 

 

Sprite Editor 에 들어가지 않으면 Window -> Package Manager 세 들어갑니다 

 

 

package Manager에서 2 DSprite를 인스톨합니다 

 

 

 

 

 

 

 

 

그러면 Sprite Ediltor에 들어가서  자동으로 그림파일을 나누는 작업을 합니다 

아래 그림과 같이 Slilce 해주고 Apply 합니다 

 

 

그림파일을 hierarchy 창에 옮긴 후 각각의 그림파일이 보일 수 있게 Sorting Layer를 지정하고 Order in Layer 각각의 값을 줍니다 

 

하이 라키에 빈 오프젝트를 만들고 이름을 Player 하고 그림파일을 자식으로 옮깁니다 

 

 

 

 

 

 

 

 

Player를 선택하고 Window -> Animation->Animation을 선택합니다 

 

Animation 탭에서 Create New Clip.. 을 선택하여  Player_idle 을 만들고 애니메이션을  만듭니다 

 

 

 

 

Player_Run 애니메이션을 만듭니다 

 

 

 

 

Scripts 폴더를 만들고 새로운 Player 스크립트를 만듭니다  

Player 오브젝트에 Player 스크립트를 연결하고 Rigidbody2D 컴포넌트를 생성해줍니다 

그리고 Player 스크립트를 작성합니다 

 

 

 

Player 스크립트 작성

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{
    public float speed;

    private Rigidbody2D rigid;

    private Vector2 moveAmount;

    private void Start()
    {
        rigid = GetComponent<Rigidbody2D>();
    }

    private void Update()
    {
        //키보드(WSAD)의 좌우상하를 방향을 정의해 준다   
        Vector2 moveInput = new Vector2(Input.GetAxisRaw("Horizontal"),
            Input.GetAxisRaw("Vertical"));

        //움직임방향에 속도를 곱한다
        moveAmount = moveInput.normalized * speed;
    }

    private void FixedUpdate()
    {
        //움직임 방향에 시간에 따라 리지드 바디 포지션값을 더한다 
        rigid.MovePosition(rigid.position + moveAmount * Time.fixedDeltaTime);
    }

}

 

 

키보드에서  상하좌우 키와 WSAD 키보드를 움직이면 캐릭터가 상하 좌우 방향 대로 움직이는 것을 확인합니다 

Player.psd
1.07MB

 

 

 

 

 

Player 오브젝트를 선택하고 Animation -> Animator 를 선택합니다 

 

 

Animator 창이 뜨면 Base Layer 에서 Player_idle과 Player_Run을 서로 Make Transition 하여 연결합니다 

그리고 Parameters 에서 + 버튼을 누르고 Bool을 선택하고 이름을 Run으로 합니다 

 

 

 

Player_idle에서 Player_Run으로 가는 선을 선택하고 Conditions에서 + 추가하고 Run을 선택하고 true 하며 아래 사진과 같이 속성 값을 바꿉니다 

 

Player_Run에서 Player_idle 가는 선을 선택하고  Conditions 에서 + 추가하고 Run 하고 fale 하며 아래와 같이 속성 값을 바꿉니다 

 

 

 

Player 스크립트를 수정 합니다 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{
    public float speed;

    private Rigidbody2D rigid;

    private Vector2 moveAmount;

    private Animator anim;
    private void Start()
    {
        rigid = GetComponent<Rigidbody2D>();
        anim = GetComponent<Animator>();


    }

    private void Update()
    {
        //키보드(WSAD)의 좌우상하를 방향을 정의해 준다   
        Vector2 moveInput = new Vector2(Input.GetAxisRaw("Horizontal"),
            Input.GetAxisRaw("Vertical"));

        //움직임방향에 속도를 곱한다
        moveAmount = moveInput.normalized * speed;

        //키보드를 누르면 Player 애니메이터 파라미터를 적용하고 캐릭터를 움직인다 
        if (moveInput != Vector2.zero)
        {
            anim.SetBool("Run", true);
        }
        else
        {
            anim.SetBool("Run", false);
        }
    }

    private void FixedUpdate()
    {
        //움직임 방향에 시간에 따라 리지드 바디 포지션값을 더한다 
        rigid.MovePosition(rigid.position + moveAmount * Time.fixedDeltaTime);
    }

}

 

 

 

아래 화면과 같이 캐릭터가 평상시 Player_idle 에서 키보드 누르면 Player_Run으로 애니메이션 되는 것을 볼 수 있습니다 

 

반응형
반응형

Box를 만들고 Parameters를 3,2,1로 하고 폴리곤 박스를 생성합니다 

 

cut 기능으로 버텍스를 추가하여 아래 그림과 같이 에지 선을 추가합니다 

 

아래  그림과 같이 엄지 손가락 부분을 만들기 위한 면을 Extrude 합니다 

 

 

 

 

손가락을 만들기 위해서 4개의 면을 선택하고 Extrude 옵션에 들어가서 by polygon을 선택하고 면을 뽑습니다 

 

 

 

 

 

 

 

 

몸통과 연결 하기 위해 팔과 연결되는 부분에 면을 지워 줍니다 

 

 

몸통과 버텍스를 맞춥니다 

 

 

팔과 다리 얼굴 몸통에 붙인 모습

 

manHand2018.max
0.87MB

반응형
반응형

몸통이 완성되었으면 발(foot) 모델링을 합니다

box를 생성하고 파라미터를 2,2,2로 합니다 

 

 

Extrude 기능을 사용 하여 3번 뽑습니다 

 

 

 

 

 

 

백그라운드 모양대로 버텍스를 움직여 모양을 맞춥니다 

 

 

면을 선택하여 몸통과 연결되는 부분을 없애 줍니다

아래 그림과 같이 버텍스가 몸통과 연결되는 부분과 일치되어야 합니다 

 

아래 그림과 같이 cut 기능을 이용 하여 버텍스를 추가하여 에지를 추가합니다 

 

 

 

 

발가락이 5개 되도록 아래 그림과 같이  cut 기능을 이용 하여 버텍스를 추가합니다 

 

 

 

 

Extrude 기능을 이용하여 아래 그림과 같이 면을 뽑아줍니다 

아래 그림과 같이 한번더 면을 뽑아줍니다 

 

 

 

버텍스를 움직여서 발 모양에 가깝게 모양을 만듭니다 

 

몸통과 연결이 될수있도록 맞추어 줍니다 

manfoot2018.max
1.01MB

반응형
반응형

3DS max를 이용하여 인체 모델링 몸통을 만들어 보았습니다

실린더 모형을 아래 그림과 같이 5,1,12 를 맞추고 생성합니다 

3ㅇ

 

백그라운드 배경에 맞게 버텍스를 조정하여 맞춥니다 

 

 

Extrude를 사용하여 두 번 위쪽 면을 두 번 올려 줍니다 

그리고 목 모양에 버텍스를 움직이며 그림에 맞춥니다 

 

 

 

 

옆 모양에 버텍스 3줄 추가 하여 모양을 맞춥니다 

 

절반의 폴리곤을 선택하여 오른쪽 면을 없애줍니다 

 

아래 그림과 같이 Symmetry 명령을 주어서 오른쪽에 같이 움직이는 폴리곤을 나타나게 합니다

실린더를 생성하여 파라미터 값을  5,1,8을 맞추고  팔 모양에 맞춥니다 

 

선 2줄을 추가 합니다 

 

 

팔 모양에 버텍스를 움직입니다 

 

어깨 면4개를 선택하고 Extrude 합니다 

 

팔과 몸통을 attach 합니다   그리고 팔을 서로 연결하기 위해서 중간에 있는 cap을 삭제합니다 

 

 버텍스 에서 Target Weld 기능을 이용하여 팔과 몸통을 붙여줍니다 

 

 

실린더를 생성하여 파라미터 값을 5,1,8 로 맞춥니다 

 

선을 추가 하고 다리 모양에 버텍스를 맞춥니다 

 

에지 선택하고 Bridge 시키고 connect 기능으로 3줄 추가합니다 

 

다리 폴리곤을 attach 시키고 cap을 삭제 합니다 

그리고 Target Weld 기능으로 몸통과 연결합니다 

 

몸통에 엣지 2줄 추가합니다

 

 

 

Extrude 기능으로 면을 뽑아 올립니다 

 

 

허리와 엉덩이 부분을 버텍스를 움직이며 맞춥니다 

 

 

엉덩이 부분에  cut 기능을 이용하여 에지를 추가합니다 

 

 

 

 

몸통을 백그라운드 모양에 잘 맞추고 완성합니다 

 

manBody2018.max
0.88MB

반응형
반응형

남자 얼굴 모델링을 로우 폴리 모델링을 하였습니다  

먼저 실린더 오브젝트를 생성한 다음 5, 1,12  넣습니다 

그리고 마우스 오른쪽 버튼을 누른 후 convert to:  -> convert to Editable poly를 선택하여 오브젝트를 모델링할 수 있는 폴리곤으로 만듭니다 

 

오른쪽 배경에 있는 백그라운드 그림을 바탕으로 버텍스를 옮기면서 얼굴형상을 만듭니다 

 

정면 백그라운드 그림을 바탕으로 폴리곤 오브젝트 버택스를 욿직이며 형태를 맞춥니다 

 

 

정수리 부분에 아래그림과 같이 edge를 추가합니다 

 

정수리 부분을 버텍스를 욺직이며 정렬합니다 

 

폴리곤 오브젝트 정면에서 절반을 지움니다 

 

 

폴리곤을 선택하고  Modifier List 에서 Symmetry를 선택합니다 

 

옆모습을 다듬습니다 

 

Edge를 추가하여 버텍스를 다듬습니다

 

 

눈 언저를 부분 polygon을 선택한 다음 Inset 를 눌러서 아래 그림과 같이 합니다  

 

 

입 주위 부분의 Polygon을 선택한 후 Extrude을 누른 후 다듬습니다 

 

옆모습의 버택스를 옮기며  백그라운드 그림과 같이 눈 주위와 입 주위를 다듬습니다 

 

 

입 주위의 edge 3개 추가합니다 

 

버택스를 옮기며 다듬습니다 

 

 

edge를 추가 합니다 

 

 

 

cut 기능을 이용하여 edge를 추가합니다 

 

귀부분의 면을 선택하여 Inset 를 누릅니다 

 

 

옆 그림에 맞추어 버택스를 욺직입니다 

 

 

귀 부분 면을 선택하여 extrude 시킵니다 

 

볼 쪽에 edge를 추가 합니다 

 

 

완성하였습니다 ㅎㅎ

manHead01.max
0.77MB

 

반응형

+ Recent posts