먼저 저는 몬스터(이하 좀비)가 플레이어를 따라오게 만드는 알고리즘을 짜고있습니다.


정확히는 플레이어가 걷는다던가등의 행동을 하면 좀비의 '소리'레벨을 일정수치 이상 오르게 하고 

좀비가 이 '소리'레벨을 일정수치 이상(이하 '맥스소리'레벨) 가지게 된다면 플레이어가 마지막으로 '소리'레벨이 오르는 행동을 한 장소로

움직이게 하는 알고리즘을 짰습니다.


근데 좀비가 가지고있는 '소리'레벨이 너무 기하급수적으로 올라서 문제입니다. 이렇게 되면 플레이어가 움직이자마자 좀비가 바로 움직이게 되겠죠


저는 그래서 몇가지 알고리즘을 추가했습니다.


1. 좀비의 '소리'레벨이 정확히 1씩 올라가게 한다


2. 플레이어의 x좌표가 정확히 1.0 변경될때 좀비의 '소리'레벨이 1씩 오르게 한다


3. 플레이어가 움직이면 움직인 만큼 시간을 재서 (a키또는 d키를 누른만큼) 좀비의 '소리'레벨이 오르게 한다 


이렇게 두가지 제약을 각각 두고 다시 실행 시켜봤는데도 결과는 다름없이 '소리'레벨이 기하급수적으로 올라버립니다. 

이 기하급수적으로 오르는 '소리'값을 정상화 시키고싶어요 ㅠㅠㅠ

코드와 콘솔창 올리겠습니다. 


public class PlayerCont : MonoBehaviour

{

    public float moveSpeed = 5f;

    public float soundLevelPerStep = 1f;

    public float soundLevelPerSecond = 1f; // 초당 증가할 소리 레벨

    private float keyPressDuration = 0f;  // 키가 눌린 시간

    private bool isKeyDown = false;       // 키가 눌렸는지 여부


    public GameObject meleeWeapon;          // 근접 무기 오브젝트 연결

    public GameObject rangedWeapon;         // 원거리 무기 오브젝트 연결


    public LayerMask enemyLayer;

    public LayerMask destructibleLayer;

    public Transform shootPoint;


    public int dp = 10;

    //public StatusUI statusUI;

    public GameObject saveNotification;     // 저장 알림 UI 오브젝트


    public int attackPower = 10;

    public int health = 100;

    public int defense = 10;

    public int stamina = 100;


    private float previousXPosition; // 이전 프레임의 플레이어 x 좌표

    private bool isRangedWeaponEquipped = true;

    private bool isNearSavePoint = false;   // 저장 지점 근처 여부



    private void Start()

    {

        previousXPosition = transform.position.x; // 초기 x 좌표 저장

        saveNotification.SetActive(false);      // 게임 시작 시 알림을 숨깁니다.

        LoadGame();

    }


    void Update()

    {

        // 좌우 이동

        float horizontalInput = Input.GetAxisRaw("Horizontal");

        transform.Translate(Vector3.right * horizontalInput * moveSpeed * Time.deltaTime);


        // 키가 눌리는 동안 시간 누적

        if (Input.GetKey(KeyCode.LeftArrow) || Input.GetKey(KeyCode.RightArrow))

        {

            isKeyDown = true;

            keyPressDuration += Time.deltaTime; // 눌린 시간 누적

        }


        // 키를 떼는 순간 소리 발생

        if (Input.GetKeyUp(KeyCode.LeftArrow) || Input.GetKeyUp(KeyCode.RightArrow))

        {

            isKeyDown = false;

            GenerateSoundBasedOnKeyPress();

            keyPressDuration = 0f; // 시간 초기화

        }


        // 현재 x 좌표와 이전 x 좌표의 차이 계산

        float distanceMovedX = transform.position.x - previousXPosition;


        // x 좌표가 1.0씩 이동했을 때 정확히 한 번만 소리 발생

        if (Mathf.Abs(distanceMovedX) >= 1.0f)

        {

            MakeSound(soundLevelPerStep); // 1씩 증가하는 소리 발생

            previousXPosition += Mathf.Sign(distanceMovedX) * 1.0f; // 1.0 단위로 갱신

        }

    void MakeSound(float soundLevel)

    {

        MonsterAI[] monsters = FindObjectsOfType<MonsterAI>();

        foreach (MonsterAI monster in monsters)

        {

            monster.HearSound(soundLevel);

        }

    }


    void GenerateSoundBasedOnKeyPress()

    {

        // 키 누른 시간만큼 소리 계산

        float generatedSoundLevel = keyPressDuration * soundLevelPerSecond;


        // 몬스터들에게 소리 전달

        MonsterAI[] monsters = FindObjectsOfType<MonsterAI>();

        foreach (MonsterAI monster in monsters)

        {

            monster.HearSound(generatedSoundLevel);

        }


        Debug.Log($"키 눌림 시간: {keyPressDuration}s, 생성된 소리 레벨: {generatedSoundLevel}");

    }



public class MonsterAI : MonoBehaviour

{

    public float maxSoundThreshold = 20f;           // 최대 소리 임계값

    public float soundDecayRate = 1f;               // 소리 감쇠 속도

    public float movementSpeed = 5f;                // 몬스터 이동 속도

    public float baseDetectionRange = 2f;           // 기본 감지 범위

    public float detectionRangeMultiplier = 0.1f;   // 감지 범위 증가량


    public float currentSoundLevel = 0f;           // 현재 소리 레벨

    private Vector3 targetPosition;                 // 몬스터가 이동할 위치

    private bool isMovingToSound = false;           // 소리 위치로 이동 중인지 여부



    // 플레이어의 행동에 따라 소리 레벨 조정

    public void HearSound(float soundLevel)

    {

        currentSoundLevel += soundLevel; // soundLevel이 1씩만 전달되므로 1씩 증가하게 됨

        Debug.Log("현재 소리 레벨 = " + currentSoundLevel);

    }


}



24b0d121e09c28a8699fe8b115ef046c66f42f4b9e


게임시작하고 1초만에 소리값이 50이상 올라버립니다. 



ps. 자대에서 챗지피티 가지고 메모장 코딩하다가 전역하고 그거 그대로 옮겨서 유니티에 적용시킨다고 여러가지 보기에 필요없는 코드가 많습니다...ㅎ