










using UnityEngine;
public class textMoving : MonoBehaviour
{
private RectTransform rectTransform;
private Vector3 targetPosition;
private void Start()
{
rectTransform = GetComponent<RectTransform>();
targetPosition = rectTransform.anchoredPosition;
}
public void Update()
{
// 엔터는 Return
if (Input.GetKeyDown(KeyCode.Return) && targetPosition.y > 0)
{
targetPosition = new Vector3(253.5f, -7.8f, 0.0f);
}
else if (Input.GetKeyDown(KeyCode.Return) && targetPosition.y < 0)
{
targetPosition = new Vector3(253.5f, 1200f, 0.0f);
}
MoveTowardsTarget();
}
private void MoveTowardsTarget()
{
// Lerp 함수를 사용하여 부드럽게 이동
rectTransform.anchoredPosition = Vector3.Lerp(rectTransform.anchoredPosition, targetPosition, Time.deltaTime * 2.0f);
}
}

Canvas를 생성할 때 같이 생성되며 한 씬에 하나만 생성된다
empty object를 만들어 Event sytem 컴포넌트들을 추가해 억지로 event system을 한 개 이상 만들고 게임을 실행하면 Event system이 하나만 있는지 확인하라고 경고가 뜬다
input(마우스, 키보드 등) 기반 애플리케이션에 포함되는 오브젝트에 이벤트를 보내는 시스템
Event System에는 이를 위한 컴포넌트들이 존재
EventSystem 자체가 EventSystem 모듈 사이의 관리자 및 퍼실리 데이터로 설계되어 많은 기능이 노출되지는 않는다
이벤트시스템은 다음과 같은 일을 한다
Event Sytem의 Input Module은 앱이 지원할 입력 시스템 (터치, 조이스틱, 마우스 등)에 따라 어떻게 동작하게 할지 등을 커스터마이징 할 수 있는데 이런 설정에 따라 이벤트를 수신하고 처리한다

Event System이 지원하는 이벤트에는 OnPointerEnter(포인터가 오브젝트에 들어간 경우 호출), On Select (오브젝트를 선택하는 순간 호출), OnMove(이동 이벤트 발생했을 때 호출) 등이 있으며, 개발자가 작성한 Input Module에 따라 커스터마이징도 가능
EventSystem의 입력 이벤트를 감지하기 위해서 꼭 필요한 것이 Rycaster이며 이 중 하나가 바로 Canvas의 Graphic Raycaster이다.

이 밖에 Physics 2D Raycaster (2D 물리 요소용), Physics Raycaster (3D 물리 요소용)가 기본으로 제공된다
아래와 같은 방식으로 동작한다









using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using TMPro;
using Photon.Pun;
using Photon.Realtime;
// MonoBehaviour 이 아닌 Pun 내에 함수를 사용하기 위한 MonoBehaviourPunCallbacks
public class LobbyManager : MonoBehaviourPunCallbacks
{
public Button loginBtn;
// TMP_Text 형 변수 선언
public TMP_Text IDtext;
public TMP_Text ConnectionStatus;
// Start is called before the first frame update
private void Start()
{
PhotonNetwork.ConnectUsingSettings();
// 버튼 활성화 상태 기본 false로 비활성화 적용
loginBtn.interactable = false;
ConnectionStatus.text = "서버에 연결 중 입니다...";
}
public void Connect()
{
// Equals ==
if (IDtext.text.Equals(""))
{
return;
}
else
{
PhotonNetwork.LocalPlayer.NickName = IDtext.text;
loginBtn.interactable = false;
// 연결에 성공했을 때
if (PhotonNetwork.IsConnected)
{
ConnectionStatus.text = "방에 연결 중 입니다...";
// 방에 랜덤으로 입장
PhotonNetwork.JoinRandomOrCreateRoom();
}
// 연결에 실패했을 때
else
{
ConnectionStatus.text = "오프라인 : 연결에 실패 했습니다. \n 재연결 중...";
PhotonNetwork.ConnectUsingSettings();
}
}
}
// 서버를 사용할 수 있기 전에 최초 연결이 성립될 때 호출
public override void OnConnectedToMaster()
{
loginBtn.interactable = true;
ConnectionStatus.text = "서버에 연결되었습니다!";
}
public override void OnDisconnected(DisconnectCause cause)
{
loginBtn.interactable = false;
ConnectionStatus.text = "오프라인 : 연결에 실패 했습니다. \n 재연결 중...";
}
public override void OnJoinRandomFailed(short returnCode, string message)
{
ConnectionStatus.text = "빈 방이 없습니다. 방을 생성 중 입니다...";
}
public override void OnJoinedRoom()
{
ConnectionStatus.text = "방에 연결되었습니다.";
PhotonNetwork.LoadLevel("Main");
}
}













using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using TMPro;
using Photon.Realtime;
using Photon.Pun;
public class ChatManager : MonoBehaviourPunCallbacks
{
public List<string> chatList = new List<string>();
public Button sentBtn;
public TMP_Text chatLog;
public TMP_Text chattingList;
public TMP_InputField input;
public ScrollRect scroll_rect;
string chatters;
// Start is called before the first frame update
void Start()
{
PhotonNetwork.IsMessageQueueRunning = true;
scroll_rect = GameObject.FindObjectOfType<ScrollRect>();
}
public void SendButtonOnClicked()
{
if (input.text.Equals(""))
{
Debug.Log("Empty");
return;
}
string msg = string.Format("[{0}] {1}", PhotonNetwork.LocalPlayer.NickName, input.text);
photonView.RPC("ReciveMsg", RpcTarget.OthersBuffered, msg);
ReceiveMsg(msg);
input.text = "";
}
private void Update()
{
ChatterUpdate();
if (Input.GetKeyUp(KeyCode.Return) && !input.isFocused)
{
SendButtonOnClicked();
}
}
void ChatterUpdate()
{
chatters = "Player List\n";
foreach (Player p in PhotonNetwork.PlayerList)
{
chatters += p.NickName + "\n";
}
chattingList.text = chatters;
}
[PunRPC]
public void ReceiveMsg(string msg)
{
chatLog.text += "\n" + msg;
scroll_rect.verticalNormalizedPosition = 0.0f;
}
}









Update 메소드에선 chatterUpdate(); 메소드로 주기적으로 플레이어 리스트를 업데이트하며, input에 포커스가 맞춰져있고 엔터키가 눌려졌을 경우에도 SendButtonOnClicked(); 메소드를 실행하는 기능을 추가
스크롤 수정 스크립트
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using TMPro;
using Photon.Realtime;
using Photon.Pun;
public class ChatManager : MonoBehaviourPunCallbacks
{
public List<string> chatList = new List<string>();
public Button sentBtn;
public TMP_Text chatLog;
public TMP_Text chattingList;
public TMP_InputField input;
public ScrollRect scroll_rect;
string chatters;
private float scrollSensitivity = 0.1f; // 스크롤 감도 조절
// Start is called before the first frame update
void Start()
{
PhotonNetwork.IsMessageQueueRunning = true;
scroll_rect = FindObjectOfType<ScrollRect>();
}
public void SendButtonOnClicked()
{
if (input.text.Equals(""))
{
Debug.Log("Empty");
return;
}
string msg = string.Format("[{0}] {1}", PhotonNetwork.LocalPlayer.NickName, input.text);
photonView.RPC("ReceiveMsg", RpcTarget.OthersBuffered, msg);
ReceiveMsg(msg);
input.ActivateInputField();
input.text = "";
}
private void Update()
{
ChatterUpdate();
if (Input.GetKeyUp(KeyCode.Return) && !input.isFocused)
{
SendButtonOnClicked();
}
// 스크롤 위치 조절
if (Input.GetMouseButtonDown(0))
{
StopCoroutine("ScrollToBottom");
}
else if (Input.GetMouseButtonUp(0))
{
StartCoroutine("ScrollToBottom");
}
}
void ChatterUpdate()
{
chatters = "참가자\n";
foreach (Player p in PhotonNetwork.PlayerList)
{
chatters += p.NickName + "\n";
}
chattingList.text = chatters;
}
[PunRPC]
public void ReceiveMsg(string msg)
{
chatLog.text += "\n" + msg;
StartCoroutine("ScrollToBottom");
}
IEnumerator ScrollToBottom()
{
yield return null;
float normalizedPosition = 1f - scrollSensitivity;
scroll_rect.verticalNormalizedPosition = normalizedPosition;
}
}