rtrt.cs 6.17 KB
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//강아지를 부를 수 있게 Mesh Collider 컴포넌트 추가, Mesh에 Husky 추가가 되어 있어야 합니다.

//상호작용창 생성방법 : Hierarchy창 우클릭 - UI - Canvas
//Canvas의 Render Mode는 World Space로 설정, 강아지를 부모 오브젝트로 설정, 기본적으로는 비활성화
//Canvas의 자식오브젝트에는 UI - Text, UI - Button 5개(빵야, 앉아, 엎드려, 먹이주기, 종료)
//추가로 2D Object - Sprite로 빈 스프라이트 생성, Sprite Render에 단색 이미지를 넣어 배경 설정 가능

public class rtrt : MonoBehaviour
{
    Animator animator;
    Transform camera;
            
    string camera_name = "Camera Rig";//카메라 오브젝트(혹은 그것의 부모 오브젝트)의 이름

    float len = 3.0f;//상호작용 창을 띄울 수 있는 거리 (카메라와 강아지 사이의 거리가 len이상일 때 강아지를 클릭하면 강아지가 카메라를 향해 걸어간다)

    float husky_speed = 0.02f;//강아지가 카메라를 향해 걸어갈 때 그 속도

    public bool clicked = false, active = false, walk, stopwalk, death, sitting, lie, eat;

    void Start()
    {
        animator = GetComponent<Animator>();
    }

    //Event Trigger - Pointer Click
    public void Clicked()
    {
        clicked = true;
    }

    //Husky오브젝트 안의 Event Trigger - Pointer Click
    //Canvas오브젝트 안의 종료 버튼 Event Trigger - Pointer Click
    //빵야 애니메이션의 경우 강아지를 클릭시 idle애니메이션으로 복귀
    public void Reset()
    {
        animator.SetBool("offDeath", true);
    }

    //Canvas오브젝트 안의 빵야 버튼 Event Trigger - Pointer Click
    public void Death_button()
    {
        death = true;
    }

    //Canvas오브젝트 안의 앉아 버튼 Event Trigger - Pointer Click
    public void Sitting_Button()
    {
        sitting = true;
    }

    //Canvas오브젝트 안의 엎드려 버튼 Event Trigger - Pointer Click
    public void Lie_Button()
    {
        lie = true;
    }

    //Canvas오브젝트 안의 먹이주기 버튼 Event Trigger - Pointer Click
    public void Eat_Button()
    {
        eat = true;
    }

    void Update()
    {
        camera = GameObject.Find(camera_name).transform; //카메라 오브젝트의 tranform

        Vector3 zero_height_husky = new Vector3(transform.position[0], -3.8f, transform.position[2]); //y값을 0으로 한 강아지 오브젝트의 위치벡터
        Vector3 zero_height_camera = new Vector3(camera.position[0], -3.8f, camera.position[2]);//y값을 0으로 한 카메라 오브젝트의 위치벡터
        Vector3 s = zero_height_camera - zero_height_husky; 
       
        //강아지를 클릭시 특정 거리이상이면 특정 거리 이하가 될 때까지 카메라를 향해 걸어감
        if (clicked)
        {
            if (len * len > len_square(camera.position))
            {
                active = true;
                clicked = false;
                animator.SetBool("offWalk", true);
                stopwalk = false;
            }
            else
            {
                transform.position = Vector3.MoveTowards(transform.position, zero_height_camera, husky_speed);
                look_camera(s);
                if (stopwalk)
                {
                    walk = false;
                }
                else
                {
                    walk = true;
                    stopwalk = true;
                }
                
            }
        }


        if (walk)
        {
            animator.SetBool("onWalk", true);
            animator.SetBool("offWalk", false);
            walk = false;
        }
        else
        {
            animator.SetBool("onWalk", false);
        }

        //Death_Button이 실행되면 애니메이션 실행
        if (death)
        {
            animator.SetBool("onDeath", true);
            animator.SetBool("offDeath", false);
            death = false;
        }
        else
        {
            animator.SetBool("onDeath", false);
        }

        //Sitting_Button이 실행되면 애
        if (sitting)
        {
            animator.SetBool("onSitting", true);
            sitting = false;
        }
        else
        {
            animator.SetBool("onSitting", false);
        }

        //Lie_Button이 실행되면 애니메이션 실행
        if (lie)
        {
            animator.SetBool("onLie", true);
            lie = false;
        }
        else
        {
            animator.SetBool("onLie", false);
        }

        //Eat_Button이 실행되면 애니메이션 실행
        if (eat)
        {
            animator.SetBool("onEat", true);
            eat = false;
        }
        else
        {
            animator.SetBool("onEat", false);
        }

    }
    
    //강아지의 rotation을 카메라를 향하게 하는 함수(Update에서 사용됨)
    public void look_camera(Vector3 s)
    {
        if (s[2] > 0)
        {
            transform.localEulerAngles = new Vector3(0, 180 / Mathf.Acos(-1) * Mathf.Atan(s[0] / s[2]), 0);
        }
        else { transform.localEulerAngles = new Vector3(0, (180 / Mathf.Acos(-1) * Mathf.Atan(s[0] / s[2])) + 180, 0); }
    }

    //사용자가 특정 거리 미만일 때 강아지의 상호작용창 활성화
    //Husky오브젝트 안의 총 버튼 Event Trigger - Pointer Click (입력 오브젝트는 Canvas)
    public void Active(GameObject obj)
    {
        if (active && len * len > len_square(camera.position))
        {
            obj.gameObject.SetActive(true);
            active = false;
        }
         
    }

    //상호작용창 비활성화
    //Canvas오브젝트 안의 종료 버튼 Event Trigger - Pointer Click (입력 오브젝트는 Canvas)
    public void DeActive(GameObject obj)
    {
        obj.gameObject.SetActive(false);
    }

    //강아지와 카메라 사이의 거리를 구하기 위해 만든 함수
    float len_square(Vector3 vec)
    {
        float result = 0;
        for (int i = 0; i < 3; i++)
        {
            result += (vec[i] - transform.position[i]) * (vec[i] - transform.position[i]);
        }
        return result;
    }
}