[ 무료 ] 웹툰 , 이상한 것들

2025년 1월 6일 월요일

3. 김치런 게임 Mover .cs 소스코드

저처럼 코드 입력하기 싫고 실행을 해보고 싶은 분들,
Ctrl+C, Ctrl+V 복사 붙여넣기 해서 사용하세요.
한 번 실행해 보면 유니티 구조적 이해에 많은 도움됩니다.

김치런 튜토리얼 영상 링크
https://www.youtube.com/watch?v=A58_FWqiekI

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

public class Mover : MonoBehaviour
{
    [Header("Settings")]
    public float moveSpeed; // 이동 속도를 설정하기 위한 변수

    // Update is called once per frame
    void Update()
    {
        // 게임 오브젝트를 왼쪽으로 이동
        transform.position += Vector3.left * GameManager.Instance.CalculateGameSpeed() * Time.deltaTime;
    }
}


코드 구조 및 주요 기능

  1. 플레이어 점프 처리:

    • Update()에서 스페이스바 입력 감지 후, Rigidbody2D에 위쪽으로 힘을 가해 점프.
    • isGrounded를 이용해 플레이어가 땅에 닿아있을 때만 점프 가능.

코드 분석

  1. Settings 섹션:

    • moveSpeed: 게임 오브젝트의 기본 이동 속도를 설정하기 위한 변수이지만, 현재 코드에서는 사용되지 않고 있음.
  2. Update() 메서드:

    • 매 프레임마다 transform.position을 변경하여 오브젝트를 왼쪽으로 이동시킴.
    • 이동 속도는 GameManager.Instance.CalculateGameSpeed() 메서드에 의해 동적으로 계산됨.
    • Time.deltaTime을 곱해 프레임 속도에 관계없이 일정한 속도로 이동하도록 설정.
  3. GameManager와 연동:

    • GameManagerCalculateGameSpeed() 메서드를 호출해 게임의 현재 속도에 따라 오브젝트의 이동 속도를 조정.
    • 이 구조를 통해 게임이 진행될수록 점점 더 빠르게 이동하도록 설정.

코드 동작

  • 게임 내에서 장애물이나 배경 요소와 같은 오브젝트들이 왼쪽으로 이동하는 동작을 구현.
  • GameManager의 게임 상태에 따라 이동 속도가 동적으로 변경되며, 게임 난이도가 조절됨.

개선 사항

  1. moveSpeed 변수 활용:

    • moveSpeed를 기본 이동 속도로 사용하고, 이를 GameManager.Instance.CalculateGameSpeed()와 결합하여 속도를 조절할 수 있음.
      transform.position += Vector3.left * moveSpeed * GameManager.Instance.CalculateGameSpeed() * Time.deltaTime;
  2. 게임 상태 확인 추가:

    • GameManager의 상태에 따라 움직임을 멈추거나 다르게 처리할 수 있음. 예를 들어, 게임이 GameState.Dead 상태일 때 오브젝트를 멈추도록 설정:
      if (GameManager.Instance.State == GameState.Playing) { transform.position += Vector3.left * GameManager.Instance.CalculateGameSpeed() * Time.deltaTime; }
  3. 이동 방향 변경:

    • 현재는 오브젝트가 왼쪽(Vector3.left)으로만 이동하지만, 게임 디자인에 따라 다른 방향으로도 이동할 수 있도록 확장 가능.

최종 구현 예시 (개선 반영):


using System.Collections; using System.Collections.Generic; using UnityEngine; public class Mover : MonoBehaviour { [Header("Settings")] public float moveSpeed = 1f; // 기본 이동 속도 // Update is called once per frame void Update() { if (GameManager.Instance.State == GameState.Playing) { // 이동 방향: 왼쪽으로 기본 속도와 게임 속도를 곱하여 이동 transform.position += Vector3.left * moveSpeed * GameManager.Instance.CalculateGameSpeed() * Time.deltaTime; } } }

이 코드는 GameManager의 상태를 확인하고, moveSpeed와 게임 속도를 결합하여 더 유연한 이동 속도 조정이 가능합니다.

2. 김치런 게임 GameManager .cs 소스코드

저처럼 코드 입력하기 싫고 실행을 해보고 싶은 분들,
Ctrl+C, Ctrl+V 복사 붙여넣기 해서 사용하세요.
한 번 실행해 보면 유니티 구조적 이해에 많은 도움됩니다.

김치런 튜토리얼 영상 링크
https://www.youtube.com/watch?v=A58_FWqiekI


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

// 게임의 상태를 정의하는 열거형 (Intro, Playing, Dead 세 가지 상태)
public enum GameState {
    Intro,  // 게임 시작 전 상태
    Playing, // 게임 진행 중 상태
    Dead // 플레이어 사망 상태
}

public class GameManager : MonoBehaviour
{
    // Singleton 패턴으로 GameManager 인스턴스를 관리
    public static GameManager Instance;

    // 현재 게임 상태 저장
    public GameState State = GameState.Intro;

    // 게임 시작 시간 및 플레이어의 목숨 수
    public float PlayStartTime;
    public int lives = 3;

    [Header("References")] // Unity Inspector에서 섹션 구분
    public GameObject IntroUI;        // 게임 시작 화면 UI
    public GameObject DeadUI;         // 사망 후 화면 UI
    public GameObject EnemySpawner;   // 적 스포너
    public GameObject FoodSpawner;    // 음식 스포너
    public GameObject GoldenSpawner;  // 황금 아이템 스포너
    public Player PlayerScript;       // 플레이어 스크립트
    public TMP_Text scoreText;        // 점수 및 UI 텍스트

    private void Awake() {
        // Singleton 초기화
        if (Instance == null){
            Instance = this;
        }
    }

    void Start()
    {
        // 게임 시작 시 Intro UI 활성화
        IntroUI.SetActive(true);
    }

    // 현재 점수를 계산하는 함수 (게임 시작 후 경과 시간)
    float CalculateScore() {
        return Time.time - PlayStartTime;
    }

    // 최고 점수를 저장하는 함수
    void SavehighScore() {
        int score = Mathf.FloorToInt(CalculateScore()); // 현재 점수를 정수로 변환
        int currentHighScore = PlayerPrefs.GetInt("highScore"); // 기존 최고 점수 가져오기

        // 새로운 점수가 기존 점수보다 높으면 갱신
        if (score > currentHighScore) {
            PlayerPrefs.SetInt("highScore", score);
            PlayerPrefs.Save();
        }
    }

    // 저장된 최고 점수를 가져오는 함수
    int GetHighScore() {
        return PlayerPrefs.GetInt("highScore");
    }

    // 게임 진행 속도를 계산하는 함수 (시간이 지남에 따라 속도가 빨라짐)
    public float CalculateGameSpeed() {
        if (State != GameState.Playing) {
            return 5f; // 게임이 진행 중이 아니면 기본 속도 반환
        }

        // 경과 시간에 비례하여 속도 증가 (최대 30f로 제한)
        float speed = 8f + (0.5f * Mathf.Floor(CalculateScore() / 10f));
        return Mathf.Min(speed, 30f);
    }

    void Update()
    {
        // 게임 상태에 따라 UI를 업데이트
        if (State == GameState.Playing) {
            scoreText.text = "Score: " + Mathf.FloorToInt(CalculateScore());
        } else if (State == GameState.Dead) {
            scoreText.text = "High Score: " + GetHighScore();
        }

        // Intro 상태에서 스페이스바를 누르면 게임 시작
        if (State == GameState.Intro && Input.GetKeyDown(KeyCode.Space)) {
            State = GameState.Playing;
            IntroUI.SetActive(false);          // Intro UI 비활성화
            EnemySpawner.SetActive(true);      // 적 스포너 활성화
            FoodSpawner.SetActive(true);       // 음식 스포너 활성화
            GoldenSpawner.SetActive(true);     // 황금 스포너 활성화
            PlayStartTime = Time.time;         // 게임 시작 시간 기록
        }

        // Playing 상태에서 목숨이 0이 되면 게임 오버 처리
        if (State == GameState.Playing && lives == 0) {
            PlayerScript.KillPlayer();         // 플레이어 사망 처리
            EnemySpawner.SetActive(false);    // 모든 스포너 비활성화
            FoodSpawner.SetActive(false);
            GoldenSpawner.SetActive(false);
            DeadUI.SetActive(true);           // Dead UI 활성화
            Transform startButton = DeadUI.transform.Find("start_button");
                if (startButton != null)
                {
                    startButton.gameObject.SetActive(true); // start_button만 활성화
                }
            State = GameState.Dead;           // 상태를 Dead로 변경
            SavehighScore();                  // 최고 점수 저장
        }

        // Dead 상태에서 스페이스바를 누르면 게임 재시작
        if (State == GameState.Dead && Input.GetKeyDown(KeyCode.Space)) {
            SceneManager.LoadScene("SampleScene"); // 현재 씬 재로딩
        }
    }
}

코드 구조 및 주요 기능

  1. Singleton 패턴:

    • GameManager 클래스의 단일 인스턴스를 관리하며, 전역적으로 접근 가능.
  2. 게임 상태 관리:

    • GameState 열거형으로 게임 상태를 관리하며, Intro, Playing, Dead 상태로 구분.
  3. 점수 및 속도 계산:

    • CalculateScore(): 게임 진행 중 경과 시간을 계산하여 점수로 표시.
    • CalculateGameSpeed(): 게임 속도를 동적으로 계산하여 최대 30f까지 증가.
  4. 최고 점수 저장:

    • PlayerPrefs를 사용하여 최고 점수를 저장하고 로드.
  5. 게임 흐름 제어:

    • Update() 메서드에서 GameState를 기반으로 게임 상태와 UI를 제어.

개선 가능성

  1. 코드 분리:
    • UI 제어 로직과 게임 상태 업데이트를 별도의 함수로 분리하여 가독성 향상.
  2. 주석 추가:
    • 함수와 변수에 대한 추가 주석으로 명확한 설명 제공.
  3. 에러 처리:
    • PlayerPrefs 접근 시 기본값 설정 또는 에러 처리가 필요할 수 있음.

1. 김치런 게임 Player .cs 소스코드

저처럼 코드 입력하기 싫고 실행을 해보고 싶은 분들,
Ctrl+C, Ctrl+V 복사 붙여넣기 해서 사용하세요.
한 번 실행해 보면 유니티 구조적 이해에 많은 도움됩니다.

김치런 튜토리얼 영상 링크
https://www.youtube.com/watch?v=A58_FWqiekI


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

public class Player : MonoBehaviour
{
    [Header("Settings")]
    public float JumpForce; // 점프 시 적용될 힘의 크기

    [Header("References")]
    public Rigidbody2D PlayRigidbody; // 플레이어의 Rigidbody2D 컴포넌트
    private bool isGrounded = true;   // 플레이어가 땅에 닿아 있는지 여부

    public Animator PlayerAnimator;  // 플레이어 애니메이터

    public bool isInvincible = false; // 무적 상태 여부
    public BoxCollider2D PlayerCollider; // 플레이어의 충돌체

    // Start is called before the first frame update
    void Start()
    {
        // 초기화 코드 (현재는 비어 있음)
    }

    // Update is called once per frame
    void Update()
    {
        // 스페이스바를 눌렀고, 플레이어가 땅에 닿아 있는 경우 점프
        if (Input.GetKeyDown(KeyCode.Space) && isGrounded) {

            //PlayRigidbody.linearVelocityX = 10;//실험용
            //PlayRigidbody.linearVelocityY = 20;//실험용
            //PlayRigidbody.velocity = new Vector2(3, 6);//실험용

            //PlayRigidbody.AddForceY(JumpForce, ForceMode2d.Impulse );//유니티 6 용

            // Rigidbody2D에 위쪽으로 힘을 가해 점프
            PlayRigidbody.AddForce(new Vector2(0f, JumpForce), ForceMode2D.Impulse);
            isGrounded = false; // 점프 후 땅에 닿아있지 않은 상태로 설정
            PlayerAnimator.SetInteger("state", 1); // 점프 애니메이션 트리거
        }
    }

    // 충돌이 감지되었을 때 호출
    private void OnCollisionEnter2D(Collision2D other) {
        // 플레이어가 "Platform"에 닿으면
        if (other.gameObject.name == "Platform") {
            if (!isGrounded) {
                PlayerAnimator.SetInteger("state", 2); // 착지 애니메이션 트리거
            }
            isGrounded = true; // 땅에 닿아있음으로 설정
        }
    }

    // 플레이어가 적과 충돌했을 때 호출 (목숨 감소)
    void Hit() {
        GameManager.Instance.lives -= 1; // 목숨 1 감소
    }

    // 플레이어가 음식을 먹었을 때 호출 (목숨 회복)
    void Heal() {
        // 목숨을 최대 3까지 회복
        GameManager.Instance.lives = Mathf.Min(3, GameManager.Instance.lives + 1);
    }

    // 플레이어가 황금을 획득하면 무적 상태 활성화
    void StartInvincible() {
        isInvincible = true; // 무적 상태 활성화
        Invoke("StoptInvincible", 5f); // 5초 후 무적 상태 해제
    }

    // 무적 상태 해제
    void StoptInvincible() {
        isInvincible = false;
    }

    // 플레이어가 죽었을 때 처리
    public void KillPlayer() {
        PlayerCollider.enabled = false; // 충돌체 비활성화
        PlayerAnimator.enabled = false; // 애니메이터 비활성화
        PlayRigidbody.AddForce(new Vector2(0f, JumpForce), ForceMode2D.Impulse); // 마지막 점프 효과
    }

    // 플레이어가 트리거 영역에 들어갔을 때 호출
    private void OnTriggerEnter2D(Collider2D other) {
        // 적과 충돌했을 때
        if (other.gameObject.tag == "enemy") {
            if (!isInvincible) {
                Destroy(other.gameObject); // 적 객체 제거
                Hit(); // 목숨 감소
            }
        }
        // 음식과 충돌했을 때
        else if (other.gameObject.tag == "food") {
            Destroy(other.gameObject); // 음식 객체 제거
            Heal(); // 목숨 회복
        }
        // 황금과 충돌했을 때
        else if (other.gameObject.tag == "golden") {
            Destroy(other.gameObject); // 황금 객체 제거
            StartInvincible(); // 무적 상태 활성화
        }
    }
}

        

코드 구조 및 주요 기능

  1. 플레이어 점프 처리:

    • Update()에서 스페이스바 입력 감지 후, Rigidbody2D에 위쪽으로 힘을 가해 점프.
    • isGrounded를 이용해 플레이어가 땅에 닿아있을 때만 점프 가능.
  2. 애니메이션 제어:

    • PlayerAnimator를 사용해 점프(1) 및 착지(2) 상태에 따른 애니메이션 트리거.
  3. 충돌 처리:

    • OnCollisionEnter2D: "Platform"과 충돌 시 착지 처리.
    • OnTriggerEnter2D: 적, 음식, 황금과의 충돌을 처리하여 각각 목숨 감소, 회복, 무적 상태 부여.
  4. 게임 상태 관리:

    • Hit()Heal() 함수로 GameManagerlives 값을 조작.
    • 무적 상태(isInvincible)를 5초 동안 유지하도록 구현.
  5. 플레이어 사망 처리:

    • KillPlayer()로 충돌체와 애니메이션을 비활성화하고 마지막 점프 효과를 부여.

개선 가능성

  1. 애니메이션 상태 관리 개선:

    • 애니메이션 상태를 숫자가 아닌 열거형(Enum)으로 관리하면 가독성 향상.
  2. 코드 중복 제거:

    • OnTriggerEnter2D 내에서 Destroy()와 상태 변경 코드를 함수화하여 중복을 줄일 수 있음.
  3. 에러 처리:

    • GameManager.Instance가 null일 경우를 대비한 에러 처리 필요.
  4. 물리 기반 코드:

    • 점프 로직에서 PlayRigidbody.velocity를 직접 설정해 물리적 결과를 더 세밀히 제어 가능.

2025년 1월 1일 수요일

Driver Magician Lite: 드라이버 백업과 복원을 쉽게!

 Driver Magician Lite: 드라이버 백업과 복원을 쉽게!

Driver Magician Lite는 Windows 사용자에게 꼭 필요한 무료 드라이버 백업 및 복원 도구입니다. 이 프로그램은 시스템에 설치된 모든 하드웨어 드라이버를 간편하게 저장하고, 필요할 때 복원할 수 있는 기능을 제공합니다. 운영 체제를 다시 설치하거나 문제가 발생했을 때, 시간을 절약하고 시스템을 정상적으로 복구하는 데 유용합니다.


Driver Magician Lite의 주요 특징

  1. 드라이버 백업

    • 현재 시스템에 설치된 하드웨어 드라이버를 탐지하여 파일로 저장할 수 있습니다. 이렇게 저장된 드라이버는 USB나 외장 하드에 보관해두면 안전합니다.

  2. 드라이버 복원

    • 백업된 드라이버를 사용하여 시스템을 원래 상태로 복원할 수 있습니다. 운영 체제 재설치 후 매우 유용합니다.

  3. 가벼운 소프트웨어

    • 설치 파일 크기가 작고, 시스템 자원을 거의 사용하지 않아 오래된 컴퓨터에서도 원활하게 작동합니다.

  4. 무료 제공

    • Driver Magician Lite는 상업 버전의 일부 기능을 제한적으로 제공하지만, 드라이버 백업 및 복원에는 충분히 유용합니다.


Driver Magician Lite 사용 방법



  1. 프로그램 실행

    • 공식 웹사이트에서 Driver Magician Lite를 다운로드하여 설치합니다.

  2. 드라이버 백업

    • 프로그램을 실행한 후, "Backup" 버튼을 클릭합니다.

    • 백업할 드라이버를 선택한 뒤, 저장 경로를 설정합니다.

    • "Start Backup" 버튼을 누르면 선택한 드라이버가 지정된 폴더에 저장됩니다.

  3. 드라이버 복원

    • 장치 관리자 열기.
    • 드라이버를 복원할 장치를 선택 후 "드라이버 업데이트" 선택.
    • "드라이버를 수동으로 설치" 클릭.
    • 백업 폴더 경로를 지정 후 "다음" 클릭.





Driver Magician Lite의 한계

  • 드라이버 업데이트 기능 부재

    • 드라이버를 최신 상태로 유지하려면 별도의 업데이트 도구가 필요합니다.

  • 기본적인 기능만 제공

    • Driver Magician(유료 버전)과 비교하면 업데이트, 삭제, 드라이버 다운로드 기능이 없습니다.


다운로드 및 설치

Driver Magician Lite는 공식 웹사이트에서 무료로 다운로드할 수 있습니다. 프로그램 크기가 작고 설치가 간단하며, 초보자도 쉽게 사용할 수 있습니다. 

(Driver Magician Lite 검색해보세요)


결론

Driver Magician Lite는 PC 드라이버 관리를 간소화하고, 불필요한 시간 낭비를 줄여줍니다. 드라이버 업데이트가 필요 없는 기본 사용자나, 운영 체제 재설치를 대비한 백업이 필요한 경우라면 꼭 추천하고 싶은 소프트웨어입니다. 지금 다운로드하여 PC를 더 안전하고 편리하게 관리해 보세요!



-


Sidewinder


World


FishMusic


LaughingBaby