1. sin, cos, tan는 직각삼각형에서만 해당된다.

2. 삼각형에서 제일 큰 변은 제일 큰 각과 마주보고 있는 변이다.
(그래서 직각삼각형에선 제일 큰 각은 90도이며 90도와 마주보고있는 빗변이 제일 길다.)

위 설명은 [직각]이 오른쪽에 위치했을 때만 해당 된다. 직각의 위치에 따라 달라진다.

3. arcsin, arccos, arctan를 사용하면 값으로 부터 대응하는 각도(θ)를 구할 수 있다.
 ex) θ = arcsin(sinθ)
      θ = arccos(cosθ)
      θ = arctan(tanθ)

4. 단위원

단위원이란 반지름이 '1'인 원

5. 단위원 풀이
단위원의 반지름이 r일경우
sinθ = b/r -> r·sinθ = b
cosθ = a/r -> r·cosθ = a
점(a,b) = (cosθ, r·sinθ)

피타고라스의 정리를 사용하면,
r² = a² + b²
r² = (cosθ)² + (r·sinθ)²
r² = r²·cos²θ + r²·sin²θ
1 = cosθ + sinθ

6. 삼각함수 사이의 관계
tanθ = sinθ / cosθ
sin²θ + cos²θ = 1

 

7. 삼각함수의 값의 부호

6.삼각함수의 특수각

 

'게임개발 > 게임수학' 카테고리의 다른 글

벡터  (0) 2021.07.27
삼각함수 그래프  (0) 2020.02.17
sin과 cos법칙  (0) 2020.02.17
부채꼴의 호의 길이와 넓이  (0) 2020.02.14
radian(호도법)과 degree(일반각)  (0) 2020.02.14

 

// ABCharacter.h
UCLASS()
class ARENABATTLE_API AABCharacter : public ACharacter
{
	GENERATED_BODY()

public:
	// Sets default values for this character's properties
	AABCharacter();

protected:
	...

	float ArmLengthTo;
	FRotator ArmRotationTo;
	float ArmLengthSpeed;
	float ArmRotationSpeed;
public:	
	...

	UPROPERTY(VisibleAnywhere, Category = Camera)
	USpringArmComponent* SpringArm;

	UPROPERTY(VisibleAnywhere, Category = Movement)
	UCameraComponent* Camera;
    
    ...

private:
	virtual void Jump() override;
	void UpDown(float NewAxisValue);
	void LeftRight(float NewAxisValue);
	void LookUp(float NewAxisValue);
	void Turn(float NewAxisValue);
    
	...

};
// ABCharacter.cpp

// 생성자
AABCharacter::AABCharacter()
	: ArmLengthTo(0.0f)
	, ArmRotationTo(FRotator::ZeroRotator)
	, ArmLengthSpeed(0.0f)
	, ArmRotationSpeed(0.0f)
{
    // Set this character to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
    PrimaryActorTick.bCanEverTick = true;

    //카메라 관련 컴포넌트 가져오기
    SpringArm = CreateDefaultSubobject<USpringArmComponent>(TEXT("SPRINGARM"));
    Camera = CreateDefaultSubobject<UCameraComponent>(TEXT("CAMERA"));

    ...

    //SpringArm은 캐릭터에 붙이고, 카메라는 SpringArm에 붙착 돼서 SpringArm의 움직임을 기준으로 카메라가 비추게 된다.
    SpringArm->SetupAttachment(GetCapsuleComponent());
    Camera->SetupAttachment(SpringArm);

    ...

    //SpringArm 길이, 위치 설정
    SpringArm->TargetArmLength = 400.0f;
    SpringArm->SetRelativeRotation(FRotator(-15.0f, 0.0f, 0.0f));

    ...
    //3인칭 카메라 모드 설정(GTA 카메라 시점)
    SetControlMode(EControlMode::GTA);
    //SpringArm 속도 설정
    ArmLengthSpeed = 3.0f;
    ArmRotationSpeed = 10.0f;

    //캐릭터 점프력 설정
    GetCharacterMovement()->JumpZVelocity = 400.0f;

    ...
}

// Called to bind functionality to input
void AABCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
    Super::SetupPlayerInputComponent(PlayerInputComponent);

    PlayerInputComponent->BindAction(TEXT("Jump"), EInputEvent::IE_Pressed, this, &AABCharacter::Jump);
    PlayerInputComponent->BindAxis(TEXT("UpDown"), this, &AABCharacter::UpDown);
    PlayerInputComponent->BindAxis(TEXT("LeftRight"), this, &AABCharacter::LeftRight);
    PlayerInputComponent->BindAxis(TEXT("LookUp"), this, &AABCharacter::LookUp);
    PlayerInputComponent->BindAxis(TEXT("Turn"), this, &AABCharacter::Turn);
}


void AABCharacter::SetControlMode(EControlMode ControlMode)
{
    UCharacterMovementComponent& CharacterMovement = *GetCharacterMovement();

    ArmLengthTo = 450.0f;
    SpringArm->bUsePawnControlRotation = true;
    SpringArm->bInheritPitch = true;
    SpringArm->bInheritRoll = true;
    SpringArm->bInheritYaw = true;
    SpringArm->bDoCollisionTest = true;
    bUseControllerRotationYaw = false;
    CharacterMovement.bOrientRotationToMovement = true;
    CharacterMovement.bUseControllerDesiredRotation = false;
    CharacterMovement.RotationRate = FRotator(0.0f, 720.0f, 0.0f);
}

void AABCharacter::Jump()
{
    // 공격 모션중엔 점프를 못한다.
    if (IsAttacking == true)
   	 return;

    Super::Jump();
}

// SpringArm의 Rotation 값은 옵션에 의해 ControlRotation값과 동일하므로 ControlRoation 값이 곧 카메라가 바라보는 방향이다.
// ControlRotation의 값으로부터 회전 행렬을 생성 한 후, 원하는 방향 축을 대입해 캐릭터가 움직일 방향 값을 가져올 수 있다.
// 시선 방향 X축, 우측 방향 Y축
void AABCharacter::UpDown(float NewAsixValue)
{
    // 공격 모션중엔 움직이지 못한다.
    if (IsAttacking == true)
    	return;

    switch (CurrentControlMode)
    {
      case EControlMode::GTA:
      	AddMovementInput(FRotationMatrix(GetControlRotation()).GetUnitAxis(EAxis::X), NewAsixValue);
      	break;
    }
}

void AABCharacter::LeftRight(float NewAsixValue)
{
	// 공격 모션중엔 움직이지 못한다.
    if (IsAttacking == true)
    return;

    switch (CurrentControlMode)
    {
      case EControlMode::GTA:
      	AddMovementInput(FRotationMatrix(GetControlRotation()).GetUnitAxis(EAxis::Y), NewAsixValue);
      	break;
    }
}

void AABCharacter::LookUp(float NewAsixValue)
{
    switch (CurrentControlMode)
    {
      case EControlMode::GTA:
      	AddControllerPitchInput(NewAsixValue);
      	break;
    }
}

void AABCharacter::Turn(float NewAsixValue)
{
    switch (CurrentControlMode)
    {
    case EControlMode::GTA:
      AddControllerYawInput(NewAsixValue);
      break;
    }
}
    AndroidJavaClass m_UnityPlayer;
    AndroidJavaObject m_CurrentActivity;
    AndroidJavaClass m_ContextCombat;
    
    // 생성자
    public PermissionManager()
    {
        // Unity Android의 부모역할을 하는 클래스
        m_UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        // 현재 실행되고 있는 Android Activity를 가져온다
        m_CurrentActivity = m_UnityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
        // 권한여부를 가져올 수 있는 클래스
        m_ContextCombat = new AndroidJavaClass("android.support.v4.content.ContextCompat");
    }
    
    /** GetAndroidPhoneNumber를 Android Code로 이해할 경우.
       public class CurrentActivity extends  UnityPlayerActivity
       {
           protected void GetPhoneNumber()
           {
               TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
               PhoneNumber = tm.getLine1Number();
           }
       }
    */
    public string GetAndroidPhoneNumber()
    {
        string str = "";

        if (m_CurrentActivity == null)
            return "";

        if (IsPermissionGranted(Permissions.READ_PHONE_STATE) == false)
            return "";

        // 액티비티에서 Android Navtive Method 인 "getSystemService"를 호출
        AndroidJavaObject pServiceObj = m_CurrentActivity.Call<AndroidJavaObject>("getSystemService", "phone");
        if (pServiceObj == null)
            return "";

        // 자바 클래스 가져옴
        AndroidJavaClass clazz = new AndroidJavaClass("java.lang.Class");
        if (clazz == null)
            return "";

        // 자바 클래스에 있는 TelephonyManager클래스 가져옴
        AndroidJavaObject pDest = clazz.CallStatic<AndroidJavaObject>("forName", "android.telephony.TelephonyManager");
        if (pDest == null)
            return "";

        //"getSystemService"로 가져온 SystemService Instance를 TelephonyManager로 캐스팅함
        AndroidJavaObject pTelephonyService = pDest.Call<AndroidJavaObject>("cast", pServiceObj);
        if (pTelephonyService == null)
            return "";

        //이로서 pTelephonyService은 TelephonyManager의 인스턴스로 사용가능
        str = pTelephonyService.Call<string>("getLine1Number");
        //Debug.Log("PhoneNumber1 : " + str);

        if (string.IsNullOrEmpty(str) == true)
            return "";

        if (str.Length > 0 && str[0] == '+')
        {
            str = "0" + str.Substring(3);
        }

        //Debug.Log("PhoneNumber2 : " + str);
        return str;
    }

'게임개발 > 유니티' 카테고리의 다른 글

[UniteSeoul 2020] Tips & Tricks For Using Profiler  (0) 2020.12.02
AssetBundle 관리  (0) 2020.04.13
단발성 진동 알람 이벤트 처리  (0) 2019.04.24
unity google play games plugin 연동 문제  (0) 2018.08.17
베지어 곡선  (0) 2017.01.17

필요 예) 게임을 Auto Mode로 설정 한 뒤 설정한 조건에 의해 Auto가 종료 될 경우 이것을 알려주기 위해 핸드폰을 단발적으로 진동 시킨다.

 

사용 - Handheld.Vibrate();

설명 - 디바이스를 1회 진동시킨다.

-문제-

  • Social.localUser.Authenticate 호출 시 App Crash(튕김) 현상 발생
  • Social.localUser.Authenticate에 보낸 콜백이 호출 되지 않음

-원인-

  • Google Play Games Plugin Setup시 입력한 ClientID가 AndroidManifest.xml에 저장된 ClientID와 동일하지 않을경우 발생
    (AndroidManifest.xml 경로 : ../Assets\GooglePlayGames\Plugins\Android\GooglePlayGamesManifest.plugin/AndroidManifest.xml)
  • 하지만, 확인결과 xml과 동일하게 들어가 있었음
  • Unity Build 시 AndroidManifest.xml병합 설명 : https://docs.unity3d.com/Manual/android-manifest.html

-해결-

  • Unity Android 빌드 시 AndroidManifest.xml 병합 과정에서 개행문자 오류로 인해 ClientID부분을 잘못 인식 하고 있었음
  • xml ClientID에 '\u003'문자 추가 후 해결
  • <meta-data android:name="com.google.android.gms.games.APP_ID" android:value="\ 232323232323" />
    -> <meta-data android:name="com.google.android.gms.games.APP_ID" android:value="\u003232323232323" />
  • 참고자료 : https://github.com/playgameservices/play-games-plugin-for-unity/issues/2013


// 0.0 >= t <= 1.0 her be magic and dragons  
    public Vector3 GetPointAtTime(float t)
    {
        float u = 1f - t;
        float tt = t * t;
        float uu = u * u;
        float uuu = uu * u;
        float ttt = tt * t;

        Vector3 p = uuu * this.points[0].position; //first term  
        p += 3 * uu * t * this.points[1].position; //second term  
        p += 3 * u * tt * this.points[2].position; //third term  
        p += ttt * this.points[3].position; //fourth term  

        return p;
    }
t : 시간
point[0] : 시작지점
point[1] : 조절 지점 1
point[2] : 조절 지점 2
point[3] : 도착 지점

 

+ Recent posts