작업 현황
- 플레이어 식별화
- 플레이어 충돌 및 튀는 현상 제거
ApplyKillerNameRed() 메소드에서 플레이어 이름 검정으로 설정하면 덮어쓰게돼서 해당 코드 삭제void Start()
{
...
if (photonView.Owner != null)
{
playerNameText.text = photonView.Owner.NickName;
playerNameText.color = Color.black; //일반적으로는 검정색 설정
}
#region 맵 테스트용 임시 코드
if (photonView.IsMine)
{
playerNameText.color = Color.green; //여기서 자기자신이면 초록색 설정
CameraFollow cam = Camera.main.GetComponent<CameraFollow>();
if (cam != null)
{
cam.target = this.transform;
}
// 혹시 모르니 Start()에서 IsDead false로 저장.
Hashtable startProps = new Hashtable();
startProps.Add("IsDead", false);
PhotonNetwork.LocalPlayer.SetCustomProperties(startProps);
}
#endregion
ApplyKillerNameRed(); // 시작할 때 직업이 있을 수 있으니 여기서도 체크
}void ApplyKillerNameRed()
{
object jobValue;
if (photonView.Owner.CustomProperties.TryGetValue("Job", out jobValue))
{
string job = (string)jobValue;
if (job == "Killer" && photonView.IsMine)
{
playerNameText.color = Color.red; // 킬러면 빨간색
}
//일반인 닉네임 검정색 설정은 다른데에서 해서 + 초록색 설정 안 덮어쓰도록 이 부분은 삭제함
}
}
Player(main)에 레이어를 Player로 설정하는 걸로 간단하게 해결이 됐음.
작업 로그
- 게임 방법 초안 작업
- 사운드 작업

Start()) 부분에 패널을 디폴트로는 꺼두는 스크립트 작성Update() 메소드는 불필요한 것 같아서 삭제해둠public class TitleUI : MonoBehaviour
{
[Header("UI 연결")]
[SerializeField] public GameObject gameRulePanel;
void Start()
{
if (gameRulePanel != null) gameRulePanel.SetActive(false);
}
public void GoConnect()
{
SceneManager.LoadScene("Scene_Connect");
}
public void GoHowTo()
{
gameRulePanel.SetActive(true);
}
public void OffRulePanel()
{
gameRulePanel.SetActive(false);
}
}
⇒ 전체 테스트는 타이틀씬 복사해서 새로 판 씬에서 진행했고, RulePanel을 포함한 캔버스 자식 요소를 프리팹화해두고 나중에 타이틀씬의 캔버스 아래 자식 요소를 이 프리팹을 갈고 RulePanel 인스펙터에서 연결하고 버튼 클릭 이벤트 발생 시 호출 메소드만 잘 연결하면 진짜 타이틀씬에다가 연결도 끝. 결과물은 아래 사진.

SFXPlay() 메소드에 매개변수로 사운드 이름 + 사운드 AudioClip을 전달해서 재생했는데 이렇게 하면 그때그때 필요한 곳에서 이 함수에 인자만 잘 전달하면 편할 것 같아서 이걸 쓰려고함
Awake)에 싱글톤으로 만들어주고 저 리스트를 딕셔너리로 만드는 것까지 추가해줬다.using UnityEngine;
using System.Collections.Generic;
public class SoundManager : MonoBehaviour
{
public static SoundManager instance;
[Header ("사운드 연결")]
[SerializeField] private SoundDataSO soundDataSO;
private Dictionary<string, AudioClip> sfxDictionary = new Dictionary<string, AudioClip>();
private AudioSource audioSource;
private void Awake()
{
if (instance == null)
{
instance = this;
audioSource = GetComponent<AudioSource>();
DontDestroyOnLoad(instance);
}
else
{
Destroy(gameObject);
}
if (soundDataSO != null)
{
foreach (var entry in soundDataSO.soundEntries)
{
if (!sfxDictionary.ContainsKey(entry.name))
{
sfxDictionary.Add(entry.name, entry.clip);
}
}
}
}
public void SFXPlay(string sfxName)
{
if (sfxDictionary.TryGetValue(sfxName, out AudioClip clip))
{
audioSource.PlayOneShot(clip);
}
else
{
Debug.Log("Audio Clip이 없음");
}
}
}
SFXPlay는 이제 그때그때 필요한 곳에서, 예를 들면 버튼 클릭할 때 실행하는 메소드에서 ButtonClick 문자열만 전달해서 호출해주면 클릭 소리가 나는 식으로 사용할 수 있게 해두었다.⇒ 문제는 플레이어 걸음 소리는 이렇게 처리가 안된다. 지금 생각으로는 State+애니메이션 관련 코드가 있으니까 거기에 잘 묶어서 처리하고…? 다른 플레이어 걸음 소리 문제도 있으니까 아마 PlayerController.cs 스크립트를 건드려야할 것 같다… 이건 추후에 작업
SoundManager.instance.SFXPlay("ButtonClick");을 호출하도록 코드를 추가해놨고… 이건 그냥 단순반복노동..PlayFootStep() 함수를 연결public void PlayFootStep()
{
Dictionary <string, AudioClip> sfxDictionary = SoundManager.instance.sfxDictionary;
if (sfxDictionary.TryGetValue("Walking", out AudioClip clip))
{
myAudioSource.Stop();
myAudioSource.clip = clip;
myAudioSource.Play();
}
}
Awake()) 부분에서 해당 컴포넌트를 가져올 수 있도록 코드를 추가함private AudioSource myAudioSource;
void Start()
{
rb = GetComponent<Rigidbody2D>();
spriteRenderer = GetComponent<SpriteRenderer>();
myAudioSource =GetComponent<AudioSource>();
}
회고
이때가 아마 각자 작업이 조금씩 밀려있었고...? 조금 번아웃? 올 느낌의 시기라 다들 바쁘고 일주일정도 쉬어가는 시간을 가지자고 했던 때여서 12일 목요일에 회의를 진행하고 그 전까지는 쉬었었다. 그런데 사실 팀원 다들 안 쉬고 각자 밀린 작업을 거의 완성시켜 와서 엄청 감사했던 주차..하하.:D 그리고 쉬면서 재정비하고 할 일도 싹 정리해서 최종 완성까지 해야할 일들을 정리할 수 있어서 며칠 쉬고 진행하는 선택이 정말 나쁘지 않은 선택이었던 것을 알 수 있었다. 애초에 완성까지 할 일이 그렇게 많이 남지 않아서 쉰다는 결정을 할 수 있었던 것도 있긴하다...