Unity에서 Observer를 사용하기 위해 노력하는 이야기입니다.
목표: Unity에서 Observer 모드로 활동적인 것을 만들기
생성: 입력한 정보를 변경할 때마다 이동되는 ScrollView
일단 Observer를 해봤어요.
TextObserver.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace My{
public interface ITextObserver<T>{
void Notify(string s);
}
class ShowGetText<T> : ITextObserver<T>{
public void Notify(string s){
Debug.Log(s);
}
}
public class GetText<T> : ITextObserver<T>{
public void Notify(string s){
}
}
public interface ITextSubject<T>{
void AddObserver(ITextObserver<T> observer);
void RemoveObserver(ITextObserver<T> observer);
void NotifyObserver(string s);
}
public class TextOvserver<T> : ITextSubject<T>{
private List<ITextObserver<T>> _observeList = new List<ITextObserver<T>>();
public void AddObserver(ITextObserver<T> observer ){
_observeList.Add(observer);
Debug.Log(observer);
}
public void RemoveObserver(ITextObserver<T> observer){
_observeList.Remove(observer);
}
public void NotifyObserver(string s){
_observeList.ForEach(o => o.Notify(s));
Debug.Log("Hello");
}
}
}
다음으로 Subject 측면을 변경합니다.TextSender.cs
public class TextSender : MonoBehaviour
{
public My.ITextSubject<string> Subject{get;} = new My.TextOvserver<string>();
string[] IN_Text = new string[3];
[SerializeField]
int index;
void Start(){
index = 0;
IN_Text[0] = "ラットに20ダメージを与えた";
IN_Text[1] = "ピカピカの薬を手に入れた";
IN_Text[2] = "ラットから30ダメージを受けた";
}
// Update is called once per frame
void Update()
{
if(index>2){
index=0;
}
if(Input.GetMouseButtonDown(1)){
Subject.NotifyObserver(IN_Text[index]);
++index;
}
}
}
마우스 오른쪽 버튼으로 클릭할 때마다 문장이 바뀌어 0~2로 순환한다.빈 GamaObject에 붙여넣습니다.
마지막으로 다음 프로그램을 Canvas의 ScrollView에 붙여넣습니다.
TextShow.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class TextShow : MonoBehaviour,My.ITextObserver<string>
{
[SerializeField]
public TextSender _test;
[SerializeField]
private ScrollRect scrollRect;
[SerializeField]
private Text textLog;
private string GetText;
public RectTransform originalElement;
public RectTransform content;
int elementNum;
void Awake(){
originalElement.gameObject.SetActive(false);
}
void Start()
{
scrollRect.verticalNormalizedPosition = 0;
_test.Subject.AddObserver(this);
textLog.text = GetText;
elementNum = 15;
}
void Update()
{
if(GetText != textLog.text && GetText != null){
OnSubmit();
DeleteText();
}
}
public void OnSubmit(){
textLog.text = GetText;
Debug.Log(textLog.text);
var element = GameObject.Instantiate<RectTransform> (originalElement);
element.SetParent(content, true);
element.SetAsLastSibling();
element.gameObject.SetActive(true);
--elementNum;
}
public void DeleteText(){
var clones = GameObject.FindGameObjectsWithTag("Element");
if(elementNum <= 0){
Destroy(clones[elementNum]);
++elementNum;
}
}
public void Notify(string s){
GetText = s;
}
public string OnRecieved(string value){
Debug.Log(value);
return value;
}
}
15까지 가장 오래된 데이터가 하나씩 파괴되고 있습니다.Notify에서 TextSender가 가지고 있는 텍스트 내용은 변경된 문장을 알려 줍니다.
나에게 알려준strings를 GetText,textLog에 넣으세요.내용이 text와 다르다면 ScrollView에 표시되는 프로세스여야 합니다.
출력된 문자는 Element 태그가 있는 Image에서 유지되므로 강제 분리 구조라고 생각합니다...
마지막으로 유니티에서.
상술한 설정과 같다.
아직 전혀 모르겠어!하지만 어쨌든 움직일 수 있는 물건을 만들었다.
반성: 프로젝트가 파손되었다는 소식을 여러 가지로 어획한 결과 이런 것이 완성되었다고 말하고 싶다.저는 Notify의 부분이나 뭘 잘못 썼는지, Remove의 사용 장소는 어떻게 해야 좋을지 부드러운 부분이 많아요.저는 TextSender에서 정보를 수집하면 아이템과 디스플레이 손상을 얻을 수 있다고 생각하지만 TextSender에 수집하려면 이중 Observer가 되기 때문에 아무래도 생각이 틀린 것 같습니다.
C와 C++를 물어봤지만 전혀 몰랐어요.
이게 뭐야!컨디션부터 4일 정도 걸려요.
나는 처음으로 Observer 모드를 조립해 보았다.
거의 다 테라셀 블로그에요.
http://tsubakit1.hateblo.jp/entry/2015/10/19/022720
열다
인생은 붐벼, 죽기 전에 게임을 해 보자.
http://ntgame.wpblog.jp/2018/07/14/post-1796/
이것은 문외한이 두 편의 보도를 조작한 결과다.
학습은 새 선생의 Qiita, 애니메이션, 슬라이드를 참고했다.
https://learning.unity3d.jp/1324/
위의 애니메이션이 설명하는 기분이 최고라는 걸 알았어요!
※ 문제가 있으면 삭제를 수정할 테니 이메일이나 트위터로 보내주세요.
Reference
이 문제에 관하여(Unity에서 Observer를 사용하기 위해 노력하는 이야기입니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/marbledNEET/items/7fd6630ae2170a03e442텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)