개요
요즘 열심히 하는 게임이 생겼다.
하이 우동 호텔이라는 게임인데 이 게임에는 영화관이라는 컨텐츠가 있다.
방문하는 손님들의 요구사항에 따라 만족할만한 영화를 찾아서 상영시켜야한다.
지금은 상영중인데 위에 관람소원이라는 칸을 보면 손님들이 어떤 영화를 보고싶어 하는지 힌트를 준다.
처음 봤을땐 어느 장르의 영화를 상영해야하나 검색해보고 하나하나 고르는 작업을 했다.
하다가 보니까 이거 그냥 편하게 프로그램을 하나 짜서 하면 편하지 않을까 라는 생각을 하였고
바로 실행에 옮겼다.
다 만들고 안 사실이지만 계속 정확한 영화 요구를 들어주다가 보면 위의 주황색 글씨처럼 소원 맨 끝에 어떤 장르인지 뜨는 기능이 있었다... ㅠㅠ
콘텐츠
영화 관람 소원에 대한 정보는 다음 블로그에서 참고하였다.
https://blog.naver.com/skylovely4/222635797914
기본적인 화면 구성은 다음과 같다.
코드
제일 먼저, 영화와 관람소원을 각각 Movie, Info 클래스로 정보를 담을 클래스를 만들고, 이 클래스를 제어할 수 있는 MovieManager, InfoManager를 생성하였다. (MonoBehavior를 상속받지 않기 때문에 매니저 클래스가 필요했다.)
Movie.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[System.Serializable]
public class Movie
{
public string movieName;
public List<string> propertys;
public Movie(string _name, List<string> _propertys){
movieName = _name;
propertys = _propertys;
}
}
Info.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[System.Serializable]
public class Info
{
public string str;
public string property;
public Info(string _str, string _property){
str = _str;
property = _property;
}
}
MovieManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class MovieManager : MonoBehaviour
{
public Movie movie;
[SerializeField] Text titleText;
[SerializeField] Text propertyText;
// Start is called before the first frame update
void Start()
{
titleText.text = movie.movieName;
propertyText.text = string.Join(",",movie.propertys);
}
// Update is called once per frame
void Update()
{
}
}
InfoManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class InfoManager : MonoBehaviour
{
public Info info;
public Text infostring;
public string property;
// Start is called before the first frame update
void Start()
{
infostring.text = info.str +", "+info.property;
property = info.property;
}
// Update is called once per frame
void Update()
{
}
}
이후, 프로그램의 핵심인 검색기능에 대한 코드이다.
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.AI;
using UnityEngine.UI;
public class SearchBtn : MonoBehaviour
{
GameManager theGM;
[SerializeField] GameObject popupUI;
int[] ganreCountList = new int[25]; //장르 총 25개
Dictionary<string, int> ganreCount = new Dictionary<string,int>();
public List<string> uniqueStringList = new();
public List<Movie> multipleMovieList = new();
public List<Movie> uniqueMovieList = new();
//UI
[SerializeField] GameObject moviePrefab;
[SerializeField] Text ganreText;
[SerializeField] Transform uniqueParent;
[SerializeField] Transform multipleParent;
// Start is called before the first frame update
void Start()
{
theGM = FindObjectOfType<GameManager>();
//딕셔너리 초기화
#region Dictionary
ganreCount.Add("모험",0);
ganreCount.Add("애니메이션",0);
ganreCount.Add("스토리",0);
ganreCount.Add("코미디",0);
ganreCount.Add("전기",0);
ganreCount.Add("SF",0);
ganreCount.Add("판타지",0);
ganreCount.Add("동물",0);
ganreCount.Add("로맨스",0);
ganreCount.Add("히어로",0);
ganreCount.Add("액션",0);
ganreCount.Add("힐링",0);
ganreCount.Add("도시",0);
ganreCount.Add("미스터리",0);
ganreCount.Add("새드",0);
ganreCount.Add("음악",0);
ganreCount.Add("재난",0);
ganreCount.Add("뮤지컬",0);
ganreCount.Add("사극",0);
ganreCount.Add("타임슬립",0);
ganreCount.Add("우주",0);
ganreCount.Add("성장",0);
ganreCount.Add("로봇",0);
ganreCount.Add("몬스터",0);
ganreCount.Add("미식",0);
#endregion
}
public void OnSearchBtnClick(){
//시작 전, 모든 리스트 초기화
uniqueStringList.Clear();
multipleMovieList.Clear();
uniqueMovieList.Clear();
foreach(var key in ganreCount.Keys.ToList()){
ganreCount[key] = 0;
}
//자식객체 모두 파괴
DestroyAllChildrenObjects(multipleParent);
DestroyAllChildrenObjects(uniqueParent);
//체크된 리스트에 장르 갯수 새기
for(int i =0;i<theGM.checkList.Count; i++){
ganreCount[theGM.checkList[i]] += 1;
}
//체크 리스트 중복제거
HashSet<string> hashSet = new HashSet<string>(theGM.checkList);
uniqueStringList = new List<string>(hashSet);
//모든 입력값이 포함된 영화 리스트
multipleMovieList = GetMoviesByAllGenres(uniqueStringList);
//입력값이 하나라도 포함된 리스트
uniqueMovieList = GetMoviesByGenres(uniqueStringList);
//생성
//장르 갯수 출력
string ganreStr = "";
foreach(var x in ganreCount){
if(x.Value != 0){
ganreStr += x.Key + ":" + x.Value + " ";
}
}
ganreText.text = ganreStr;
//모든 입력값 포함 생성
for(int i = 0;i<multipleMovieList.Count; i++){
GameObject newMovie = Instantiate(moviePrefab, multipleParent);
newMovie.GetComponent<MovieManager>().movie = multipleMovieList[i];
}
//하나라도 입력값 포함 생성
for(int i = 0;i<uniqueMovieList.Count; i++){
GameObject newMovie = Instantiate(moviePrefab, uniqueParent);
newMovie.GetComponent<MovieManager>().movie = uniqueMovieList[i];
}
}
public List<Movie> GetMoviesByAllGenres(List<string> genres)
{
List<Movie> result = new List<Movie>();
foreach (Movie movie in theGM.movieList)
{
// 모든 입력값이 포함되어 있는지 확인
if (genres.All(g => movie.propertys.Contains(g)))
{
result.Add(movie);
}
}
return result;
}
// 장르 중 하나라도 포함하는 영화 목록 생성
public List<Movie> GetMoviesByGenres(List<string> genres)
{
List<Movie> result = new List<Movie>();
foreach (Movie movie in theGM.movieList)
{
// 장르 중 하나라도 포함되면 결과에 추가
if (movie.propertys.Any(g => genres.Contains(g)))
{
result.Add(movie);
}
}
return result;
}
//모든 자식 객체 파괴
void DestroyAllChildrenObjects(Transform parent)
{
// 부모의 자식들을 반복하여 파괴
foreach (Transform child in parent)
{
Destroy(child.gameObject); // 자식 오브젝트 파괴
}
}
}
핵심이 되는 함수는 다음과 같다.
//모든 입력값이 포함되어있는 영화 리스트 찾기
public List<Movie> GetMoviesByAllGenres(List<string> genres)
{
List<Movie> result = new List<Movie>();
foreach (Movie movie in theGM.movieList)
{
// 모든 입력값이 포함되어 있는지 확인
if (genres.All(g => movie.propertys.Contains(g)))
{
result.Add(movie);
}
}
return result;
}
genres라는 리스트에 하위 함수인 All함수를 호출해 매개변수로 람다식을 전달하여 GameManager에 선언해둔 movieList에 장르가 모두 포함되는 영화가 있다면 반환을 시켜주도록 구성했다.
// 장르 중 하나라도 포함하는 영화 목록 생성
public List<Movie> GetMoviesByGenres(List<string> genres)
{
List<Movie> result = new List<Movie>();
foreach (Movie movie in theGM.movieList)
{
// 장르 중 하나라도 포함되면 결과에 추가
if (movie.propertys.Any(g => genres.Contains(g)))
{
result.Add(movie);
}
}
return result;
}
하나라도 포함되는 리스트는 Any함수를 호출하여 람다식으로 검색하였다.
전체 다 검색하는건 Genre리스트에서 검색하지만, 하나라도 포함되어있는건 movie리스트에서 검색한다는 차이가 하나 더 존재한다.
하나하나 직접 입력하지않고 파싱을 할 수 있었지만, 그냥 하나하나 입력해서 자료를 만들었다.
자료가 많아 코드가 길어져 GameManager는 접는글로 코드를 올린다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//찾는건 다 했는데 이제 체크해서 띄워주는거 만들어야됨.
//일단, UI부터 조금 수정하는게 좋을듯.
//밑에 조금 띄워서 장르별로 몇개 있는지 숫자로 나타내준 다음, 검색 누르면 팝업 떠서 영화목록 나오게끔 하자.
public enum Propertys{
모험,
애니메이션,
스토리,
코미디,
전기,
SF,
판타지,
동물,
로맨스,
히어로,
액션,
힐링,
도시,
미스터리,
새드,
음악,
재난,
뮤지컬,
사극,
타임슬립,
우주,
성장,
로봇,
몬스터,
미식
}
public class GameManager : MonoBehaviour
{
[SerializeField] GameObject infoPrefab;
[SerializeField] GameObject moviePrefab;
public Transform infoParent;
public Transform movieParent;
public List<Info> infoList = new();
public List<Movie> movieList = new();
public List<Info> filteredInfoList = new();
public List<GameObject> filterdInfoObj = new();
public List<GameObject> infoChild = new();
public List<string> checkList = new();
// Start is called before the first frame update
void Start()
{
#region List
//스토리
infoList.Add(new Info("긴장감 넘치는 시나리오의 영화를 보고싶어","스토리"));
infoList.Add(new Info("주인공이 어떻게 생겼든 스토리는 재밌어야 해!","스토리"));
infoList.Add(new Info("스토리가 스펙터클한 영화를 보고 싶어","스토리"));
infoList.Add(new Info("연기력이 뛰어난 영화를 보고 싶어","스토리"));
infoList.Add(new Info("감정이입이 잘 되는 영화를 보고 싶어","스토리"));
infoList.Add(new Info("마지막 반전이 대단하다던데 정말 보고 싶어","스토리"));
infoList.Add(new Info("인터넷에 이미 내용에 대한 스포일러가 올라왔어","스토리"));
//모험
infoList.Add(new Info("짜릿하고 재밌는 탐험 스토리를 보고 싶어","모험"));
infoList.Add(new Info("신비하고 자극적인 미지의 여정 이야기가 가장 끌려","모험"));
infoList.Add(new Info("위대한 여행 이야기가 담긴 명작을 보고 싶어","모험"));
infoList.Add(new Info("매력이 넘치는 여정을 동경해","모험"));
infoList.Add(new Info("뛰어난 연기력의 어드벤처 작품을 보고 싶어","모험"));
infoList.Add(new Info("주인공과 함께 비밀을 파헤치고 싶어","모험"));
infoList.Add(new Info("우리의 목적지는 별빛이 가득한 바다","모험"));
//코미디
infoList.Add(new Info("요즘 운동하러 갈 시간이 없는데, 웃음으로 복근 좀 만들어 줄래?","코미디"));
infoList.Add(new Info("박장대소하는 것만큼 기대되는 일이 있을까?","코미디"));
infoList.Add(new Info("유머 시리즈는 내가 영화를 보는 이유야","코미디"));
infoList.Add(new Info("내 삶엔 웃음이 부족해!","코미디"));
infoList.Add(new Info("크게 웃은게 언제인지, 그 느낌을 되찾고 싶어","코미디"));
infoList.Add(new Info("스트레스 없이 행복한 것이 무엇보다도 중요하다고 생각해","코미디"));
infoList.Add(new Info("친구가 최근 실연을 해서 코미디 영화를 보여줘야 해","코미디"));
//애니메이션
infoList.Add(new Info("어린시절 가장 좋아하던 영화야. 다시 그 감동을 느껴보고 싶어.","애니메이션"));
infoList.Add(new Info("아이들과 함께 가서 보고 싶어","애니메이션"));
infoList.Add(new Info("가족끼리도 볼 수 있는 재미난 영화 없을까?","애니메이션"));
infoList.Add(new Info("우리 아이도 이 영화를 좋아해","애니메이션"));
infoList.Add(new Info("알록달록한 세상을 보면 정말 힐링되는 느낌이야. 정말 기대돼","애니메이션"));
infoList.Add(new Info("나는 이 그림체가 마음에 들어. 정말 귀여워!","애니메이션"));
infoList.Add(new Info("천진난만한 동심으로 가득한 그런 영화를 보고 싶어.","애니메이션"));
//전기
infoList.Add(new Info("비극과 희극이 공존하는 다큐멘터리를 보고 싶어","전기"));
infoList.Add(new Info("스크린 앞에서 주인공의 일생을 직접 확인하고 싶어.","전기"));
infoList.Add(new Info("이 실제 이야기는 아주 예전에 이미 들어본 적 있어.","전기"));
infoList.Add(new Info("그의 실제 인생 이야기에 정말 감동했어.","전기"));
infoList.Add(new Info("그녀의 이야기를 영화로 만들면 분명 멋질거야.","전기"));
infoList.Add(new Info("주인공과 함께 힘든 인생을 해쳐나가고 싶어.","전기"));
infoList.Add(new Info("한 사람의 인생이 이리도 기구할 수 있다니.","전기"));
//SF
infoList.Add(new Info("현실을 초월하는 과학 기술과 힘에 눈이 번쩍 뜨이는 기분이야!","SF"));
infoList.Add(new Info("최고의 음향 효과와 화면 효과를 보니 기술의 위대함이 느껴져","SF"));
infoList.Add(new Info("기술과 환상이 공존하는 신비한 세계를 좋아해","SF"));
infoList.Add(new Info("예고편의 초현실적인 화면에 정말 끌렸어. 놓치고 싶지 않아.","SF"));
infoList.Add(new Info("스크린 속 이야기를 통해 시간의 비밀을 파헤치고 싶어","SF"));
infoList.Add(new Info("알 수 없는 것에 대한 탐험 정신은 정말 짜릿해","SF"));
infoList.Add(new Info("머릿속에 우주가 펼쳐지는 그런 느낌을 느껴보고 싶어.","SF"));
//로맨스
infoList.Add(new Info("여주에게 빙의해서 남주랑 연애하고 싶어!","로맨스"));
infoList.Add(new Info("나도 저렇게 감동적인 러브 스토리의 주인공이 되고 싶어.","로맨스"));
infoList.Add(new Info("보고나서 큐피드가 나를 맞혀줬으면 좋겠어.","로맨스"));
infoList.Add(new Info("달콤한 남녀 주인공의 연애 이야기를 응원하고 싶어.","로맨스"));
infoList.Add(new Info("이런 달달함과 잔인함이 공존하는 이야기는 정말 매력적이야.","로맨스"));
infoList.Add(new Info("남자랑 처음 데이트 할 때는 어떤 영화를 보는게 좋을까?","로맨스"));
infoList.Add(new Info("요즘 사는게 너무 힘들어서 달달한 영화를 보고 싶어.","로맨스"));
//판타지
infoList.Add(new Info("천마가 하늘을 나는 신기한 세상!","판타지"));
infoList.Add(new Info("마법이나 초자연적인 능력이 나오는 그런 영화를 보고 싶어!","판타지"));
infoList.Add(new Info("기이한 스토리가 정말 절묘해!","판타지"));
infoList.Add(new Info("마법사가 되고 싶은 환상은 영화에서 이룰 수밖에","판타지"));
infoList.Add(new Info("이 영화 속 주인공처럼 초능력을 가지고 싶어!","판타지"));
infoList.Add(new Info("나는 이 세상에 분명 마법을 쓸 수 있는 사람이 있을거라고 믿어.","판타지"));
infoList.Add(new Info("판타지 영화 중 대작이라 함은 아마도 이 영화를 말하는 거겠지.","판타지"));
//히어로
infoList.Add(new Info("이 세상엔 더 많은 영웅이 필요해!","히어로"));
infoList.Add(new Info("첫 영화부터 오늘까지 쭉 좋아했어. 세상을 수호하는 그가 정말 멋있어.","히어로"));
infoList.Add(new Info("울트라맨 느낌이 나는 그런 영화가 좋아","히어로"));
infoList.Add(new Info("이 영화의 주인공이 또 새로운 능력을 획득한 건 아닐까?","히어로"));
infoList.Add(new Info("이 영화의 빌런이 진짜 강하다던데, 주인공이 세상을 구할 수 있을까?","히어로"));
infoList.Add(new Info("이 세상을 그들이 지키고 있다는 걸 생각하면 정말 안심돼","히어로"));
infoList.Add(new Info("우정과 신념, 그리고 정의감에 감동받고 싶어.","히어로"));
//동물
infoList.Add(new Info("그들의 눈빛을 보니 마음이 녹는 기분이야.","동물"));
infoList.Add(new Info("귀여운 털복숭이 천사들은 바로 우리 곁에 있어!","동물"));
infoList.Add(new Info("털복숭이들에겐 약한 편이야.","동물"));
infoList.Add(new Info("반려동물을 키운 뒤부턴 이런 따뜻한 영화를 좋아하게 됐어","동물"));
infoList.Add(new Info("복슬복슬한 주인공과 함께 숲을 탐험하고 싶어.","동물"));
infoList.Add(new Info("집에 털복숭이가 있어서 이런 영화를 더욱 좋아해","동물"));
infoList.Add(new Info("고양이 집사로서 공감할 수 있는 작품을 보고 싶어.","동물"));
//액션
infoList.Add(new Info("그의 액션은 진짜 리얼해 신작이 나오면 꼭 볼꺼야.","액션"));
infoList.Add(new Info("예고편 속의 격렬한 액션 장면이 내 눈길을 사로잡았어.","액션"));
infoList.Add(new Info("아드레날린이 폭발할 것 같은 영화를 보고 싶어.","액션"));
infoList.Add(new Info("이렇게 위험한 일은 나는 못 해. 그냥 영화를 통해 대리만족이나 해야지","액션"));
infoList.Add(new Info("그의 영화가 제일 재밌어! 액션도 멋지고 스피드도 좋고!","액션"));
infoList.Add(new Info("짐승남들의 액션을 보고 싶어. 헤헤","액션"));
infoList.Add(new Info("주인공의 포스터를 보고 완전 넋이 나갔었어. 근육남 최고!","액션"));
//힐링
infoList.Add(new Info("듣자 하니 너무 웃겨서 눈물이 날 정도라던데!","힐링"));
infoList.Add(new Info("오늘 너무 힘들었어. 영화를 보면서 힐링하고 싶어.","힐링"));
infoList.Add(new Info("마음을 울리는 그런 느낌을 받고 싶어. 따뜻하고 희망적인 그런 느낌~","힐링"));
infoList.Add(new Info("친구가 따뜻하고 아름다운 분위기의 영화라고 추천해줬어.","힐링"));
infoList.Add(new Info("요즘 좀 우울해. 이 영화를 보면서 안정을 취하고 싶어.","힐링"));
infoList.Add(new Info("삶의 아름다움을 일깨워주고 마음을 위로해주는 그런 명작을 보고 싶어.","힐링"));
infoList.Add(new Info("다정함은 가장 신비한 힘이라고 들었어. 이 영화가 궁금해","힐링"));
//새드
infoList.Add(new Info("99%의 사람들이 이 영화를 볼때마다 운다고 해.","새드"));
infoList.Add(new Info("가슴 아프면서도 마음이 따뜻해지는 내가 좋아하는 장르의 영화야.","새드"));
infoList.Add(new Info("감정을 분출하며 통쾌하게 울고 싶어.","새드"));
infoList.Add(new Info("나는 잘 울지 않는 사람이라서 꼭 나를 울려줬으면 좋겠어.","새드"));
infoList.Add(new Info("세번째 관람중인데 볼 때마다 새로운 눈물 포인트를 찾아낼 수 있었어.","새드"));
infoList.Add(new Info("티슈는 이미 준비해뒀어 자 덤벼라.","새드"));
infoList.Add(new Info("눈물을 흘리면 스트레스를 해소할 수 있다고 해. 정말 기대되는 영화야.","새드"));
//도시
infoList.Add(new Info("주인공이 사회생활을 하며 겪게 되는 고난과 역경을 어떻게 극복하는지 보고 싶어.","도시"));
infoList.Add(new Info("도시 이야기를 어떻게 풀어나갈지 궁금해","도시"));
infoList.Add(new Info("현대 도시에서 일어나는 사실적인 일들을 그린 이야기를 보고 싶어.","도시"));
infoList.Add(new Info("바쁜 도시 속 작은 인물의 이야기를 보고 싶어.","도시"));
infoList.Add(new Info("이렇게 발전한 세계에서 일어나는 일들을 그려낸 영화를 더 보고 싶어.","도시"));
infoList.Add(new Info("바쁜 삶 속에서 모두 자신의 삶에 대해 느끼는 바가 있겠지.","도시"));
infoList.Add(new Info("튼튼하게 잘짜인 스토리가 내 공감대를 불러일으켰어.","도시"));
//음악
infoList.Add(new Info("어떤 영화의 배경 음악은 완전 마스터 급이라던데?","음악"));
infoList.Add(new Info("내가 바로 그 배경 음악을 듣기 위해서 이 영화를 보려는거야!","음악"));
infoList.Add(new Info("영화를 보기 전에 이미 미리 다 들어보고 왔다고.","음악"));
infoList.Add(new Info("멜로디를 통해 주인공의 감정을 더욱 극대화하는 그런 영화를 보고 싶어.","음악"));
infoList.Add(new Info("나는 배경 음악에 민감한 편이거든. 그래서 배경음악이 뛰어난 명작을 보고 싶어.","음악"));
infoList.Add(new Info("보면서 함께 노래를 따라 부를 수 있는 그런 영화가 있을까?","음악"));
infoList.Add(new Info("영화를 보며 음악 속에 푹 빠지고 싶어.","음악"));
//미스터리
infoList.Add(new Info("이 감독의 스타일은 언제나 영화의 마지막 순간에 진실이 드러나곤 해","미스터리"));
infoList.Add(new Info("완전 짜릿해. 악몽을 꾸게 되더라도 꼭 보고 싶어","미스터리"));
infoList.Add(new Info("완전 머리를 써야 하는 추리물 있을까?","미스터리"));
infoList.Add(new Info("머리가 지끈거릴 정도로 짜릿한 느낌을 느껴보고 싶어!","미스터리"));
infoList.Add(new Info("내가 결말을 맞출 수 있을지 궁금해!","미스터리"));
infoList.Add(new Info("범인이 그래서 이 사람일까?","미스터리"));
infoList.Add(new Info("나는 반전 있는 스토리를 좋아해. 시나리오와 숨바꼭질하는 기분이 들거든.","미스터리"));
//재난
infoList.Add(new Info("인간이 대자연에 맞서 싸워 이기는 스토리를 좋아해.","재난"));
infoList.Add(new Info("천재지변을 통해 삶에 대한 의미를 찾고 싶어.","재난"));
infoList.Add(new Info("주인공은 이 재난속에서 살아남을 수 있을까?","재난"));
infoList.Add(new Info("뜻밖의 재난에 대한 주제는 정말 짜릿한 것 같아.","재난"));
infoList.Add(new Info("영화를 통해 재난 속에서 살아남는 방법을 배우고 싶어.","재난"));
infoList.Add(new Info("세상의 종말같은 유형의 영화를 보고 싶어. 짜릿하면서도 무서운 그런 느낌말이야.","재난"));
infoList.Add(new Info("처참한 사고속에서 피어나는 인류애에 대한 이야기를 보고 싶어.","재난"));
//뮤지컬
infoList.Add(new Info("포스터를 보니 주인공과 함께 춤추고 싶은 기분이 들어.","뮤지컬"));
infoList.Add(new Info("클래식하면서도 아름다운 안무가 나를 유혹하는 기분이아.","뮤지컬"));
infoList.Add(new Info("배우의 노랫소리와 춤추는 자태는 내 영혼을 빼앗아 버렸어.","뮤지컬"));
infoList.Add(new Info("나도 스크린 속으로 뛰어 들어가 주인공과 함께 춤추고 싶어.","뮤지컬"));
infoList.Add(new Info("흑흑! 내 마음을 훔치는 춤을 보며 감동의 눈물을 흘리고 싶어!","뮤지컬"));
infoList.Add(new Info("배우들과 함께 노래하며 춤추고 싶어.","뮤지컬"));
infoList.Add(new Info("이 영화의 배경 음악과 안무는 역대급이라고 들었어.","뮤지컬"));
//우주
infoList.Add(new Info("우주의 모든 비밀은 사람을 매료시켜","우주"));
infoList.Add(new Info("각 행성엔 우리가 탐구할 수 있는 수많은 비밀이 숨어져 있어.","우주"));
infoList.Add(new Info("신비하고 예측할 수 없는 우주는 정말 매력적이야","우주"));
infoList.Add(new Info("하늘 밖의 세상은 미지의 세계","우주"));
infoList.Add(new Info("지구를 떠나 미지의 땅을 탐험하는 그런 영화 없을까?","우주"));
infoList.Add(new Info("나랑 같이 영화 볼 우주의 소재를 좋아하는 친구 있어?","우주"));
infoList.Add(new Info("우주의 깊은 곳은 나의 무궁한 상상력을 자극해","우주"));
//사극
infoList.Add(new Info("여운이 오래가는 사극풍의 그런 영화를 보고 싶어","사극"));
infoList.Add(new Info("사극풍 스토리는 긴장감이 넘치거든.","사극"));
infoList.Add(new Info("옛사람들의 사랑과 원한은 특유의 느낌이 있어","사극"));
infoList.Add(new Info("전통문화는 정말 탐구할 만한 가치가 있어!","사극"));
infoList.Add(new Info("난 고대 생활에 대해 로망이 있어!","사극"));
infoList.Add(new Info("사극 영화 속 아름다운 의상과 소품들을 보는 걸 좋아해","사극"));
infoList.Add(new Info("옛사람들의 생활 방식을 항상 동겨해왔어. 영화를 보면서 대리만족이라도 하고 싶어!","사극"));
// 성장
infoList.Add(new Info("슬플땐 반드시 밝은 내일이 찾아올 것이라는걸 기억해야 해.","성장"));
infoList.Add(new Info("꿈은 꼭 있어야 해. 만약 이룰 수 있다면?","성장"));
infoList.Add(new Info("긍정에너지를 느끼고 싶어!","성장"));
infoList.Add(new Info("살아있는 생명이라면 지기 싫어하는 정신을 가져야 해!","성장"));
infoList.Add(new Info("인생에 대해 언제나 희망을 가져야 해. 절대 포기하면 안 돼.","성장"));
infoList.Add(new Info("요즘 기분이 우울해 나 자신을 격려할 수 있는 그런 영화를 보고 싶어.","성장"));
infoList.Add(new Info("주인공이 고군분투하던 이야기가 진짜 있었던 일이라던데?","성장"));
//타임슬립
infoList.Add(new Info("타임머신을 통한 신비한 경험!","타임슬립"));
infoList.Add(new Info("나도 과거로 돌아갈 수 있으면 좋겠어","타임슬립"));
infoList.Add(new Info("현대인들이 고대로 돌아가 생활한다면 어떤 일들이 일어날까?","타임슬립"));
infoList.Add(new Info("그토록 오랜 시간을 이어온 사랑이라니, 정말 위대해","타임슬립"));
infoList.Add(new Info("과거를 직접 경험할 수 있기를 바랍니다(의역, 정확하지 않음)","타임슬립"));
infoList.Add(new Info("현대인들이 갑자기 과거로 돌아가게 된다면 어떤 일이 일어날지 궁금해(의역, 정확하지 않음)","타임슬립"));
infoList.Add(new Info("시간을 초월하는 소재가 제일 좋아.","타임슬립"));
//로봇
infoList.Add(new Info("거대한 메카 로봇을 보면 무기력해지는 기분이야.","로봇"));
infoList.Add(new Info("인공지능의 비약적인 발전은 인류에게 어떤 결과를 가져올까?","로봇"));
infoList.Add(new Info("전류의 음성은 나의 피를 끓어오르게 해.","로봇"));
infoList.Add(new Info("인류가 차가운 기계에 생명을 불어넣었어!","로봇"));
infoList.Add(new Info("커다란 기계에서 뿜어져 나오는 과학기술의 기운은 정말 멋있어.","로봇"));
infoList.Add(new Info("로봇들의 전투 장면을 보고 싶어!","로봇"));
infoList.Add(new Info("기계로 인류를 개조하면 어떤 이야기가 펼쳐질까?","로봇"));
//몬스터
infoList.Add(new Info("이렇게나 크고 거대한 생물을 정말 인류가 정복할 수 있을까?","몬스터"));
infoList.Add(new Info("무서운 돌연변이 마물은 우리를 두려움에 떨게 해.","몬스터"));
infoList.Add(new Info("선사 시대에 괴수들이 전투하는 장면은 정말 스릴넘쳐.","몬스터"));
infoList.Add(new Info("정말 최고의 특수효과였어. 무서운 갈퀴가 스크린을 뚫고 튀어나오는 줄 알았어.","몬스터"));
infoList.Add(new Info("무서운 외모에 숨겨진 따듯한 마음이 나를 감동하게 했어.","몬스터"));
infoList.Add(new Info("크고 위엄 넘치는 거대한 생물은 정말 매력적이야!","몬스터"));
infoList.Add(new Info("나를 향해 덮쳐올 때 정말 심장이 멈추는 줄 알았어.","몬스터"));
//미식
infoList.Add(new Info("보면 막 식욕이 돋는 그런 영화 없을까?","미식"));
infoList.Add(new Info("감독이 연출한 우리네 삶과 세간살림을 구경하는 것을 좋아해","미식"));
infoList.Add(new Info("보면서 침을 흘리게 되는지가 이 영화를 검증하는 유일한 기준이야.","미식"));
infoList.Add(new Info("살찔까 봐 걱정돼서 영화를 보면서 대리만족을 하는 수 밖에","미식"));
infoList.Add(new Info("이 영화는 분명 내 미각을 일깨울 수 있을 거야!","미식"));
infoList.Add(new Info("눈물이 입가에서 흘러나왔어.","미식"));
infoList.Add(new Info("입맛도 돌고 힐링도 되는 영화야. 내가 제일 좋아하는 영화야!","미식"));
#endregion
#region Movie
//노란색
movieList.Add(new Movie("패왕별희", new List<string>{"히어로","로맨스","스토리","타임슬립"}));
movieList.Add(new Movie("하리포터",new List<string>{"히어로","새드","판타지","몬스터"}));
movieList.Add(new Movie("카레비안의 해적",new List<string>{"모험","판타지","스토리","코미디"}));
movieList.Add(new Movie("포레스트 감프",new List<string>{"스토리","도시","전기","힐링"}));
movieList.Add(new Movie("잠자리의 숲으로",new List<string>{"스토리","새드","힐링","애니메이션"}));
movieList.Add(new Movie("꼬꼬질라",new List<string>{"SF","재난","히어로","몬스터"}));
movieList.Add(new Movie("인터갤럭시",new List<string>{"스토리","SF","모험","우주","타임슬립"}));
movieList.Add(new Movie("돈키후테",new List<string>{"스토리","히어로","전기","뮤지컬"}));
movieList.Add(new Movie("주빌리지",new List<string>{"코미디","애니메이션","모험","동물","성장"}));
movieList.Add(new Movie("다이다닉",new List<string>{"스토리","로맨스","재난","새드"}));
movieList.Add(new Movie("알라등",new List<string>{"히어로","애니메이션","판타지","스토리","모험"}));
//보라색
movieList.Add(new Movie("영웅과 호랑이",new List<string>{"히어로","사극","동물","액션"}));
movieList.Add(new Movie("피아니스트 전설",new List<string>{"뮤지컬","음악","스토리"}));
movieList.Add(new Movie("꼬마 왕자",new List<string>{"애니메이션","새드","판타지"}));
movieList.Add(new Movie("브레이킹 셰프",new List<string>{"도시","스토리","액션"}));
movieList.Add(new Movie("브로큰 시스터즈",new List<string>{"코미디","도시","스토리"}));
movieList.Add(new Movie("랩의 유령",new List<string>{"뮤지컬","음악","스토리"}));
movieList.Add(new Movie("탐정 술록",new List<string>{"스토리","액션","미스터리"}));
movieList.Add(new Movie("폼파이 고성",new List<string>{"스토리","재난","사극","새드"}));
movieList.Add(new Movie("서울행",new List<string>{"미스터리","몬스터","스토리","액션"}));
movieList.Add(new Movie("이웃집 꿀꿀이",new List<string>{"애니메이션","코미디","힐링","판타지"}));
movieList.Add(new Movie("샐러리맨 탈출",new List<string>{"스토리","도시","모험"}));
movieList.Add(new Movie("버터플라이맨",new List<string>{"히어로","모험","액션","코미디"}));
movieList.Add(new Movie("아이스크림 왕국",new List<string>{"애니메이션","코미디","로맨스","판타지"}));
movieList.Add(new Movie("아멜리에 이모",new List<string>{"스토리","힐링","도시"}));
movieList.Add(new Movie("가전 형제",new List<string>{"스토리","모험","애니메이션"}));
movieList.Add(new Movie("오리알맨",new List<string>{"몬스터","히어로","액션","SF"}));
movieList.Add(new Movie("닭의 질주",new List<string>{"모험","동물","히어로","액션"}));
movieList.Add(new Movie("TV 스크림",new List<string>{"미스터리","도시","몬스터"}));
movieList.Add(new Movie("요리왕",new List<string>{"애니메이션","미식","성장"}));
movieList.Add(new Movie("아바티",new List<string>{"액션","SF","모험"}));
movieList.Add(new Movie("나의 청춘",new List<string>{"코미디","스토리","로맨스","전기"}));
movieList.Add(new Movie("고양이 폴로",new List<string>{"스토리","힐링","동물"}));
movieList.Add(new Movie("판타스틱 맨",new List<string>{"액션","히어로","SF"}));
movieList.Add(new Movie("도라의몽",new List<string>{"코미디","모험","SF","애니메이션","로봇"}));
movieList.Add(new Movie("월-Z",new List<string>{"SF","애니메이션","모험","로봇"}));
movieList.Add(new Movie("충견 이야기",new List<string>{"동물","힐링","새드"}));
movieList.Add(new Movie("우리 가게",new List<string>{"스토리","코미디","도서"}));
movieList.Add(new Movie("동유기",new List<string>{"코미디","로맨스","판타지","사극"}));
movieList.Add(new Movie("라이프 오브 에이",new List<string>{"모험","판타지","전기"}));
//파란색
movieList.Add(new Movie("항바라를 찾아서",new List<string>{"스토리","모험","힐링"}));
movieList.Add(new Movie("요호전",new List<string>{"판타지","미스터리","사극"}));
movieList.Add(new Movie("쥐라기 회사",new List<string>{"스토리","도시","동물"}));
movieList.Add(new Movie("철인 타이탄",new List<string>{"코미디","미식","로봇"}));
movieList.Add(new Movie("레지닭트 이블",new List<string>{"스토리","액션","미스터리"}));
movieList.Add(new Movie("아크틱 림",new List<string>{"액션","로봇","몬스터"}));
movieList.Add(new Movie("2021 어스 오디세이",new List<string>{"SF","모험","우주"}));
movieList.Add(new Movie("왕눈이 외계인",new List<string>{"스토리","SF","새드"}));
movieList.Add(new Movie("버킷리스트",new List<string>{"모험","코미디","스토리","힐링"}));
movieList.Add(new Movie("마법 버블",new List<string>{"판타지","모험","미스터리"}));
movieList.Add(new Movie("쿵푸 마스터",new List<string>{"액션","스토리","히어로"}));
//초록색
movieList.Add(new Movie("테디베어",new List<string>{"애니메이션","동물"}));
movieList.Add(new Movie("오즈의 마술사",new List<string>{"판타지","뮤지컬","모험"}));
movieList.Add(new Movie("쿵푸 팡다",new List<string>{"애니메이션","액션"}));
movieList.Add(new Movie("코골이 공주",new List<string>{"판타지","로맨스"}));
movieList.Add(new Movie("아기돼지 삼 형제",new List<string>{"스토리","동물","도시"}));
movieList.Add(new Movie("성냥팔이 소녀",new List<string>{"스토리","새드","애니메이션"}));
#endregion
for(int i = 0; i<infoList.Count;i++){
GameObject newInfo = Instantiate(infoPrefab,infoParent);
newInfo.GetComponent<InfoManager>().info = infoList[i];
infoChild.Add(newInfo);
}
}
public void DestroyListContent(){
for(int i = 0 ; i < infoParent.childCount; i++){
infoParent.GetChild(i).gameObject.SetActive(false);
}
}
public void CreateListContent(){
for(int i=0;i<infoParent.childCount;i++){
infoParent.GetChild(i).gameObject.SetActive(true);
}
}
}
찾기 버튼에 들어갈 스크립트는 다음과 같이 구성했다.
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using UnityEngine;
using UnityEngine.UI;
public class FindBtn : MonoBehaviour
{
GameManager theGM;
[SerializeField] InputField inputField;
// Start is called before the first frame update
void Start()
{
theGM = FindObjectOfType<GameManager>();
}
public void FindBtnClick(){
string keyword = inputField.text;
theGM.DestroyListContent();
theGM.filterdInfoObj.Clear();
theGM.filteredInfoList.Clear(); //비워두고 다시 검색해야됨.
theGM.filteredInfoList = theGM.infoList.Where(item => item.str.Contains(keyword)).ToList();
foreach (GameObject obj in theGM.infoChild){
if(theGM.filteredInfoList.Contains(obj.GetComponent<InfoManager>().info)){
theGM.filterdInfoObj.Add(obj);
}
}
foreach (GameObject obj in theGM.filterdInfoObj){
obj.SetActive(true);
}
}
}
24번째줄(줄 수가 안보이지만...) theGM.infoList.Where(item => item.str.Contains(keyword)).ToList(); 를 보면 리스트에는 SQL 명령어로 요소를 검색할 수 있다. Select도 사용할 수 있다는 점을 개발하면서 처음 알게 되었다.
개발을 하면서 필요하다고 생각한 핵심 기능을 위주로 코드를 첨부하였는데 내가 만든 프로그램은 다른사람들도 쓸 수 있게 첨부해둔다.
처음 초보자들에게는 유용한 프로그램이 될 것 같다.
https://drive.google.com/file/d/1bdjFHlFDUZ4x1h7XYNTZlOSCbWOqU-m7/view?usp=sharing
(용량이 조금(26.6MB)있어서 링크에 올렸다.)
'Develop > Unity' 카테고리의 다른 글
[Unity] 마이크로 음성인식을 진행해보자! (0) | 2024.06.11 |
---|---|
[Unity] '객체 지향 프로그래밍'이란 무엇인가 1(object-oriented programming)(OOP) (3) | 2024.05.07 |
[Unity] 멀티 플레이를 위해 포톤을 연동하자!(Photon) - 1. 서버 연결 (1) | 2023.12.11 |
[Unity] 멀티 플레이를 위해 포톤을 연동하자!(Photon) - 0. 기본설정과 가입방법 (0) | 2023.12.09 |
[Unity] 로그라이크 맵 생성하기 (배열) (0) | 2023.11.29 |