블랙홀 만들기

  • 큰 박스 콜라이더를 만들어서
  • 그 안에 props 태그를 가진 오브젝트가 들어오면
  • 블랙홀로 빨려들어가면서 점수를 1점 얻게 해야 함
public class Blackhole : MonoBehaviour  
{  
    public Transform absorbCenter;  
  
    public float pullForce = 10f;  
    public float maxSpeed = 15f;  
    public float minSize = 0.2f;  
  
    public float absorbDistance = 0.5f;  
    public float effectStartDistance = 5f; // 크기 감소가 시작되는 거리  
          
private void OnTriggerStay(Collider other)  
    {  
        Debug.Log("[Blackhole] OnTriggerStay");  
        //  props 태그가 아니면 무시  
        if (!other.CompareTag("Props"))  
            return;  
  
        //  Rigidbody 없으면 무시  
        Rigidbody rb = other.attachedRigidbody;  
        if (rb == null)  
            return;  
  
        //  아직 로봇 팔에 붙어 있는 중이면 무시  
        if (rb.isKinematic)  
            return;  
  
        // 중심 방향으로 힘 적용  
        Vector3 direction = (absorbCenter.position - other.transform.position).normalized;  
        float distance = Vector3.Distance(absorbCenter.position, other.transform.position);  
  
          
        // 속도 늘리기  
        if (rb.velocity.magnitude < maxSpeed)  
        {  
            float distanceFactor = Mathf.Clamp01(1f / Mathf.Max(distance, 0.1f));  
            rb.AddForce(direction * pullForce * distanceFactor, ForceMode.Acceleration);  
        }  
          
        // 크기 줄이기  
        if (distance < effectStartDistance)  
        {  
            // 거리 비율 (0=가까움, 1=멀리)  
            float t = Mathf.InverseLerp(effectStartDistance, absorbDistance, distance);  
  
            // 스케일 보간 (멀리 있을 땐 1, 가까울수록 minSize)            
            float scaleFactor = Mathf.Lerp(1f, minSize, t);  
            other.transform.localScale = Vector3.one * scaleFactor;  
        }  
          
          
    }  
}

로봇 팔이 이상하게 움직이던 오류 수정

public class MoveState : BasePlayerState  
{  
  
    public Vector3 RotationAxis = Vector3.up;  
    private float currentAngle = 0f;   
    private float targetAngle = 0f;    
    public override eTransitionType ChangableStates { get; } = eTransitionType.IdleState | eTransitionType.DownState;  
    public override void Enter(RobotArmController controller)  
    {  
        currentAngle = controller.Body.localRotation.eulerAngles.y;  
        targetAngle = currentAngle;  
    }  
  
    public override void HandleInput(RobotArmController controller)  
    {  
        // A, D 키 입력 (axisInput) 기준으로 목표 회전 각도 변경  
        if (axisInput != 0)  
        {  
            float deltaAngle = axisInput * controller.GetSpeed() * Time.deltaTime;  
            targetAngle += deltaAngle;  
              
        }  
          
        base.HandleInput(controller);  
    }  
  
    public override void LogicUpdate(RobotArmController controller)  
    {  
        currentAngle = Mathf.MoveTowardsAngle(currentAngle, targetAngle, controller.GetSpeed() * 0.5f); // 보간  
        Debug.Log($"[RobotArm] TargetAngle: {targetAngle},  CurrentAngle: {currentAngle}");  
        controller.Body.localRotation = Quaternion.AngleAxis(currentAngle, RotationAxis);  
    }  
  
    public override void Exit(RobotArmController controller)  
    {  
          
    }  
}
  • 문제 1. 내가 어디는 Rotation, 어디는 LocalRotation을 써서 생긴 문제였음
  • 문제 2. 그리고 초기 값을 세팅을 똑바로 안해준게 문제였음