Exemplo n.º 1
0
    //Character Event
    protected override void OnInit()
    {
        base.OnInit();

        //카메라 매니저 관련 초기화
        m_CameraManager.Init();
        (CurrentControl as PlayerCharacterControl).Init(m_CameraManager.CurentCamera);

        //IsDied 초기값 및 true 변경시 사망처리
        IsDied = new DataValue <bool>(false);
        IsDied.AddValueChangeEvent(() =>
        {
            if (IsDied.Value)
            {
                SetAction(0, m_DieAction);
            }
        }, false);

        //IsUsingRange 초기값 및 값 변경에 따른 Animator 변수 변경 처리
        IsWeaponRange = new DataValue <bool>(false);
        IsWeaponRange.AddValueChangeEvent(() =>
        {
            m_Animator.SetBool("UsingRange", IsWeaponRange.Value);
        }, true);

        //TimeEnergy 초기값 및 최대값 정의, 0이 될 경우 사망처리
        TimeEnergy = new DataValue <float>(data.TimeEnergy_Max);
        TimeEnergy.AddValueChangeEvent(() =>
        {
            if (data.TimeEnergy_Max < TimeEnergy.Value)
            {
                TimeEnergy.SetValue(data.TimeEnergy_Max, false);
            }

            if (TimeEnergy.Value <= 0)
            {
                IsDied.Value = true;
            }
        }, false);

        //TimeScale 변경에 따른 처리
        TimeStopProgress = new DataValue <float>(0);
        TimeStopProgress.AddValueChangeEvent(() =>
        {
            //0~1으로 값 Clamp
            float clampedValue = Mathf.Clamp01(TimeStopProgress.Value);
            TimeStopProgress.SetValue(clampedValue, false);

            //시간정지에 따른 플레이어에게 가해지는 효과 설정
            m_Animator.speed = PlayerTimeScale;
            (ChildPhysic as CharacterPhysicCharacterController).SimulateScale = PlayerTimeScale;
        }, true);

        //TimeStopTimer 초기값 정의, 0아래로 줄어들면 쿨타임 적용 및 시간정지 종료
        TimeStopTimer = new DataValue <float>(0);
        TimeStopTimer.AddValueChangeEvent(() =>
        {
            if (TimeStopTimer.Value < 0)
            {
                IsUsingTimeStop.Value  = false;
                TimeStopCoolDown.Value = data.TimeStop_CoolDown;
            }
        }, false);

        //BulletCount 초기값 및 최대값 정의, 줄어들때마다 BulletChargeTimer 리셋
        BulletCount = new DataValue <int>(data.Bullet_Max);
        BulletCount.AddValueChangeEvent(() =>
        {
            if (data.TimeEnergy_Max < BulletCount.Value)
            {
                BulletCount.SetValue(data.Bullet_Max, false);
            }
        }, false);
        m_BulletCount_ConsumeTimesReporter = new DataConsumTimesReporter <int>(BulletCount, 0);
        m_BulletCount_ConsumeTimesReporter.AddValueChangeEvent(() =>
        {
            BulletChargeTimer.Value = data.Bullet_MsBetweenRecover;         //참고 : 이 함수는 BulletCount의 값이 줄어들때만 호출됨
        }, false);

        //BulletChargeTimer 초기값 정의, 타이머가 0아래로 내려가면 총알 1개 추가 및 BulletChargeTimer 리셋
        BulletChargeTimer = new DataValue <float>(0);
        BulletChargeTimer.AddValueChangeEvent(() =>
        {
            if (BulletChargeTimer.Value < 0)
            {
                BulletCount.Value      += 1;
                BulletChargeTimer.Value = data.Bullet_RecoverSpd;
            }
        });

        //기타 값들 설정
        IsUsingTimeStop  = new DataValue <bool>(false);
        TimeStopCoolDown = new DataValue <float>(0);
        (ChildPhysic as CharacterPhysicCharacterController)?.MoveSpeed.SetValue(data.Char_MoveSpd, false);       //MoveSpeed
    }