Unity: activeSelf, activeInHierarchy

이재형·2024년 5월 29일
0
post-thumbnail
post-custom-banner

시작하기에 앞서

개인프로젝트 2일차를 진행하면서 특강의 내용을 참고하여 구현사항을 내용을 진행해야겠다.

Unity 공부

배운 내용

1. activeSelf와 activeInHierarchy차이

// activeInHierarchy
if (inventoryObject.activeInHierarchy)
{
	inventoryObject.SetActive(false);
}
else
{
	inventoryObject.SetActive(true);
}

// activeSelf
if (inventoryObject.activeSelf)
{
	inventoryObject.SetActive(false);
}
else
{
	inventoryObject.SetActive(true);
}

설명: activeInHierarchy는 부모가 활성화여부에 따라 값이 변경되지만 activeSelf는 자신의 활성화여부에 따라 값이 변경된다.


예시: 부모가 모두 비활성화인 상태로 진행했을 때
activeInHierarchy > 자신(활성화) = false
activeInHierarchy > 자신(비활성화) = false
activeSelf > 자신(활성화) = true
activeSelf > 자신(비활성화) = false


프로젝트 개발 2일차

진행 사항

1. 아이템 획득 시 인벤토리로 이동

사진1: 아이템 획득 전

사진2: 아이템 획득 후 인벤토리 사진

설명: Ray로 정면으로 발사하여 오브젝트를 확인하고 있을 때 상호작용 키를 입력하면 확인한 오브젝트가 사라지고 인벤토리 안으로 오브젝트의 아이템 정보가 들어가진다.


2. 움직이는 오브젝트 구현

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MovingObject : MonoBehaviour
{
    public bool moveX;
    public bool moveY;
    public bool moveZ;
    public float moveTime;
    public float moveSpeed;

    private Vector3 moveDirction = Vector3.zero;
    private Rigidbody rigidbody;
    private PlayerController Controller = new PlayerController();

    private void Awake()
    {
        rigidbody = GetComponent<Rigidbody>();
    }

    private void Start()
    {
        StartCoroutine(MoveChange());
        if (moveX)
        {
            moveDirction += Vector3.right;
        }
        if (moveY)
        {
            moveDirction += Vector3.up;
        }
        if (moveZ)
        {
            moveDirction += Vector3.forward;
        }
        moveDirction *= moveSpeed;
    }

    private void FixedUpdate()
    {
        if (Controller != null)
        {
            Controller.platformDir = rigidbody.velocity;
        }
    }

    IEnumerator MoveChange()
    {
        while (true)
        {
            moveDirction *= -1;
            rigidbody.velocity = moveDirction;
            yield return new WaitForSeconds(moveTime);
        }
    }

    private void OnCollisionEnter(Collision collision)
    {
        if(collision.gameObject.TryGetComponent(out PlayerController controller))
        {
            Controller = controller;
        }
    }

    private void OnCollisionExit(Collision collision)
    {
        if (collision.gameObject.TryGetComponent(out PlayerController controller))
        {
            Controller.platformDir = Vector3.zero;
            Controller = null;
        }
    }
}

// PlayerController.cs
rigidbody.velocity = moveDir + platformDir;

설명: 각 move X,Y,Z를 bool과 moveSpeed로 이동 값을 정하고
충돌인 Collision의 Enter를 하면 이동을 제어하는 PlayerController값을 받아와서 오브젝트의 추가 이동 값을 지정해준다. 그 후 플레이어의 이동에 지정한 값을 합쳐서 이동시킨다.


정리

배운 내용

1. activeSelf와 activeInHierarchy: 실제 오브젝트의 활성화와 부모의 오브젝트의 활성화인지의 차이에 따라 잘 구현해야겠음

해결 못한 문제

1. 없음

문제점

1. 없음

끝 마치며...

특강에서의 내용을 참고해서 구현을 하다보니 나만의 방식이 아닌 비슷한 내용으로 구현이 되는 상황이 많이 발생하는데 실력이 향상이 되는건지... 아닌지 애매하다...

profile
한국사람
post-custom-banner

0개의 댓글