애니메이션 연출툴 관련하여 외부에서 확인할 수 있는 빌드된 버전을 개발하는데 많은 시간과 인력과 노력이 필요해서 방법을 바꾸기로 했습니다.
그래서 새 프로젝트를 생성하고 애니메이션툴을 분리하여 외부에서 작업할 수 있도록 관리하기로 하였습니다.
중요한 포인트는 핵심 코드를 외부유출하지 않도록하는것인데, 혼자서 해결하려고 했지만, 너무도 많은 코드가 서로 걸쳐 있고 핵심 코드가 뭔지 알수가 없더군요.(코딩 초짜라)
우선 분리 작업만 하고 프로그램팀과 같이 공개되면 안 되는 소스를 제거해달라고 했네요.
거의 다 작업이 된듯합니다.
 

'업무일지' 카테고리의 다른 글

업무일지 <Unlit Shader>  (0) 2023.05.16
업무일지 <메모리 사용량>  (0) 2023.05.12
업무일지 <StreamingAssets>  (0) 2023.04.26
업무일지 <연출 툴 개선>  (0) 2023.04.21
업무일지 <헤어를 깔끔하게 만드는 방법>  (0) 2023.04.19

'AI' 카테고리의 다른 글

회사 프로젝트 : 원화  (0) 2024.06.10
Leonardo.Ai  (0) 2023.05.19
여자 히어로 (stable-diffusion-webui)  (0) 2023.04.13
여자모델 (stable-diffusion-webui)  (0) 2023.04.05
AutoHotkey와 ChatGPT  (0) 2023.03.14

외부에서 게임의 리소스를 수정해서 사용하고 싶다고 하여, 유니티에서 사용되는 전용툴을 빌드해서 사용할 수 있게 하자는 의견이 있어서 이걸 작업 중입니다.
그냥 유니티에서 사용하면되는데, 복잡한 보안적인 사안이네요...
제 능력밖의 일 같기는 한데... 삽질하고 있습니다.

유니티 기능중에서 StreamingAssets폴더를 생성하면 외부에서 수정이 가능하다는 기능을 찾기는 했습니다.
헌데, 이게 단순한 텍스트기반의 파일이면 상관이 없을듯한데, FBX파일 같은 게 제대로 될지 의문입니다.
StreamingAssets폴더에 들어가는 파일은 날것 그자체라 유니티형식으로 변환이 되질 않아서... 매우 회의적이군요... 

퇴사한 프로그래머분이 만들어 놓은 연출툴이 있는데, 사용 편의가 없어서 추가하는 작업을 진행하였습니다.
Inspector에 내용을 UI로 뿌리는 작업인데, 워낙 코딩엔 초보라 시간이 오래 걸렸습니다.
어찌되었던 완성은 시켰습니다. (AI없이는 못할거 같네요.ㅎ)
 

더보기
public class NumberDropdown : MonoBehaviour
{
    public TMP_Dropdown dropdown;
    public ManagerScene managerScene;
    public SceneTest sceneTest;
    public TMP_Dropdown dropdownA; //players 1 - 1

    private void Start()
    {
        PopulateDropdown();
        PopulateDropdownA();
        

        // Load the saved player index from PlayerPrefs
        if (PlayerPrefs.HasKey("SelectedPlayer"))
        {
            int selectedPlayerIndex = PlayerPrefs.GetInt("SelectedPlayer");
            dropdownA.value = selectedPlayerIndex;
        }

        if (PlayerPrefs.HasKey("SelectedScene"))
        {
            int selectedIndex = PlayerPrefs.GetInt("SelectedScene");
            dropdown.value = selectedIndex;
        }
        

    }

    public void PopulateDropdown()
    {
        dropdown.ClearOptions();

        List<string> options = new List<string>();

        foreach (ManagerScene.SceneInfo sceneInfo in managerScene.SceneInfos)
        {
            options.Add(sceneInfo.id.ToString());
        }

        dropdown.AddOptions(options);
    }

    public void PopulateDropdownA()
    {
        dropdownA.ClearOptions();

        List<string> options = new List<string>();

        int childCount = sceneTest.playersRoot.childCount;
        for (int i = 0; i < childCount; i++)
        {
            Transform playerTransform = sceneTest.playersRoot.GetChild(i);
            options.Add(playerTransform.gameObject.name);
        }

        dropdownA.AddOptions(options);
    }

    public void OnPlayButtonClick()
    {
        int selectedIndex = dropdown.value;
        int sceneID = managerScene.SceneInfos[selectedIndex].id;

        int selectedPlayerIndex = dropdownA.value;
        sceneTest.Group[0] = selectedPlayerIndex + 1;

        // Save the selected player index and scene ID in PlayerPrefs
        PlayerPrefs.SetInt("SelectedPlayer", selectedPlayerIndex);
        PlayerPrefs.SetInt("SelectedScene", selectedIndex);
        PlayerPrefs.Save();


        sceneTest.Group[0] = selectedPlayerIndex + 1;

        sceneTest.Play(sceneID);
    }

계속 모델링의 헤어가 지저분하게 만들어지는 현상에 대해서 개선이 필요하다고 하여, 소스를 좀 흩어봤는데

머리카락의 알파가 그라데이션으로 처리되어 있더군요.

그라데이션으로 처리하면, 알파블렌딩을 하든, 알파 테스트를 하든, 결과는 좋지 않습니다.

헤어자체를 한 땀 한 땀 잘 그려 넣어야 깔끔하게 나옵니다.

단순하지만... 노가다가 답인 경우가 있습니다.

'업무일지' 카테고리의 다른 글

업무일지 <StreamingAssets>  (0) 2023.04.26
업무일지 <연출 툴 개선>  (0) 2023.04.21
업무일지 <Toon화 시키는 post-process>  (0) 2023.04.13
업무일지 <Custom post-process>  (0) 2023.04.12
업무일지 <Fresnel>  (0) 2023.04.05

HDRP에서 Custom post-process를 만들고 있습니다.

코드가 셰이더 코드처럼 보이지만, 보던 형태가 아니라 어려움이 있었습니다.

코드도 오랜만이라 어려움이 있어서, AI 도움을 받았습니다.(AI 만쉐~)

원하는 결과를 얻었습니다.

추가된 코드

더보기
    float _Threshold;
    //float _Intensity;
    TEXTURE2D_X(_MainTex);

    float4 CustomPostProcess(Varyings input) : SV_Target
    {
        UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);

    // Note that if HDUtils.DrawFullScreen is used to render the post process, use ClampAndScaleUVForBilinearPostProcessTexture(input.texcoord.xy) to get the correct UVs

    float3 sourceColor = SAMPLE_TEXTURE2D_X(_MainTex, s_linear_clamp_sampler, input.texcoord).xyz;

    // Calculate grayscale value using Rec. 709 formula
    float luminance = dot(sourceColor, float3(0.2126, 0.7152, 0.0722));

    // Determine whether color is bright or dark
    float isBright = step(luminance, 0.07);

    // Convert to black or white
    float3 color = lerp(float3(1, 1, 1), float3(0, 0, 0), isBright);

    float3 oc = color* float3(1.0, 0.0, 0.0);

    return float4(oc, 1);


    }

'업무일지' 카테고리의 다른 글

업무일지 <연출 툴 개선>  (0) 2023.04.21
업무일지 <헤어를 깔끔하게 만드는 방법>  (0) 2023.04.19
업무일지 <Custom post-process>  (0) 2023.04.12
업무일지 <Fresnel>  (0) 2023.04.05
업무일지  (0) 2023.03.30

'AI' 카테고리의 다른 글

Leonardo.Ai  (0) 2023.05.19
로고 만들기 (stable-diffusion-webui)  (0) 2023.04.28
여자모델 (stable-diffusion-webui)  (0) 2023.04.05
AutoHotkey와 ChatGPT  (0) 2023.03.14
여자모델 (stable-diffusion-webui)  (0) 2023.02.22

HDRP의 Custom post-process을 사용할수 있어서 내용을 찾아보고 있습니다.

현재 제가 사용하고 있는 유니티 버전은 HDRP를 셰이더그래프로 만들수 있는 구조가 아니고, 코드로 만들어야하는 구조입니다.

셰이더 그래프에 이제 익숙해졌는데, 코드를 다시 봐야할거 같으니 머리가 지끈 거립니다.

우선, 두개의 파일을 만들어야합니다. 그리고 아랫처럼 Project Settings에도 추가해줘야합니다.

이렇게 되면 기본 셋팅이 됩니다.

TestSimple Shader를 이제 이용하면 셰이더 제작하듯이 하면 되는거 같습니다.

 

'업무일지' 카테고리의 다른 글

업무일지 <헤어를 깔끔하게 만드는 방법>  (0) 2023.04.19
업무일지 <Toon화 시키는 post-process>  (0) 2023.04.13
업무일지 <Fresnel>  (0) 2023.04.05
업무일지  (0) 2023.03.30
업무일지<Depth Write>  (0) 2023.03.27

ChatGPT에서 키워드를 뽑으니, 결과가 꽤 좋습니다.

'AI' 카테고리의 다른 글

로고 만들기 (stable-diffusion-webui)  (0) 2023.04.28
여자 히어로 (stable-diffusion-webui)  (0) 2023.04.13
AutoHotkey와 ChatGPT  (0) 2023.03.14
여자모델 (stable-diffusion-webui)  (0) 2023.02.22
Image To Image (stable-diffusion-webui)  (0) 2023.02.09

AD님 요구로 연출때 써먹을 효과를 구성하고 있습니다.

Fresnel을 이용하여, 반반컬러을 만들어낼 방법을 찾았는데, 잘 안되더군요.

어제부터 삽질을 좀 한거 같은데, 방법을 찾은거 같습니다.

헌데, Error가 났습니다.

pow에서 음수가 발생해서 문제가 생기나 봅니다. 음수를 없애기 위해서는 Abs() 함수를 사용하여 절대값으로 변경하는게 좋다고 합니다. 사용하니, 에러가 사라졌습니다.

'업무일지' 카테고리의 다른 글

업무일지 <Toon화 시키는 post-process>  (0) 2023.04.13
업무일지 <Custom post-process>  (0) 2023.04.12
업무일지  (0) 2023.03.30
업무일지<Depth Write>  (0) 2023.03.27
업무일지<게임 맛보기>  (0) 2023.03.21

캐릭터 셰이더설정 작업

 

아웃포커싱 작업 중이었는데, 이상하게 아래와 같이 반짝이는 물체가 생겼습니다.

알고 보니 나뭇잎의 Smoothess값이 만땅이 되어있었네요.

(포스트프로세싱 테스트해보지 않으면 런칭되었어도 몰랐을 거 같군요.)

 

대마왕님 서적이 드디어 도착했군요.

찬찬히 흝어봐야겠지만, 대충 봤을 때는 다행히도 대부분 제가 알고 있는 내용들인 거 같습니다.

대마왕님 첫 서적이랑 유사하네요.(당시에 이해가 안되서 한 4,5번은 본 거 같습니다.)

'업무일지' 카테고리의 다른 글

업무일지 <Custom post-process>  (0) 2023.04.12
업무일지 <Fresnel>  (0) 2023.04.05
업무일지<Depth Write>  (0) 2023.03.27
업무일지<게임 맛보기>  (0) 2023.03.21
업무일지 <젠킨스 재구성>  (0) 2023.03.16

포스트 프로세싱을 적용 중인데, 알파 관련 이슈가 발생하였습니다.

구멍이 뚤린 부분이 아웃포커싱이 안 먹는 거...

A를 보면 알겠지만, 구멍 뚫린 부분이 아웃포커싱이 안 먹은 걸 알 수 있다.

제가 원하는 결과는 B입니다. B는 Depth Write를 끈 것입니다.

문제는 Depth Write 끄면 아래처럼 안쪽에 구가 다 보인다는 거...

원하는 결과는 C에서 더 알파가 자연스럽게 빠져야 하는 겁니다.

 

 

골치가 아프군요.

'업무일지' 카테고리의 다른 글

업무일지 <Fresnel>  (0) 2023.04.05
업무일지  (0) 2023.03.30
업무일지<게임 맛보기>  (0) 2023.03.21
업무일지 <젠킨스 재구성>  (0) 2023.03.16
업무일지 <GC효과>  (0) 2023.03.10

완전 공개 테스트가 아니다보니...  맛보기 영상...

더보기

 

 

 

'업무일지' 카테고리의 다른 글

업무일지  (0) 2023.03.30
업무일지<Depth Write>  (0) 2023.03.27
업무일지 <젠킨스 재구성>  (0) 2023.03.16
업무일지 <GC효과>  (0) 2023.03.10
업무일지<GC(garbage collector)>  (2) 2023.03.09

젠킨스쪽 다시 구성중.

 

젠킨스명령:  

-quit -batchmode -projectPath "C:/Test_F4" -logFile "C:/Work/buildlog_art.txt" -executeMethod MyBuildScript.BuildWindows

더보기
using UnityEditor;
using UnityEngine;
using System.IO;

public class MyBuildScript
{
    [MenuItem("Build/Build Windows")]
    public static void BuildWindows()
    {
        string buildFolderPath = "../LocalF4Client/F4_LOCAL/";
        if (Directory.Exists(buildFolderPath))
        {
            Directory.Delete(buildFolderPath, true);
        }
        Directory.CreateDirectory(buildFolderPath);

        string[] scenes = {
            "Assets/InGame/Scenes/LocalMode.unity",
            "Assets/InGame/Scenes/InGameScene.unity",
            "Assets/Graphics/Stage/Stage00/Stage00.unity",
            "Assets/Graphics/Stage/Stage01/Stage01.unity",
            "Assets/Graphics/Stage/Stage02/Stage02.unity",
            "Assets/Graphics/Stage/Stage03/Stage03.unity",
            "Assets/Graphics/Stage/Stage04/Stage04.unity",
            "Assets/Graphics/Stage/Stage05/Stage05.unity"
        };

        string buildPath = buildFolderPath + "Men.exe";
        BuildPlayerOptions buildOptions = new BuildPlayerOptions
        {
            scenes = scenes,
            locationPathName = buildPath,
            target = BuildTarget.StandaloneWindows64,
            options = BuildOptions.None
        };

        BuildPipeline.BuildPlayer(buildOptions);

        Directory.Delete(buildFolderPath + "Men_BackUpThisFolder_ButDontShipItWithYourGame", true);
        Directory.Delete(buildFolderPath + "Men_BurstDebugInformation_DoNotShip", true);
    }
}

'업무일지' 카테고리의 다른 글

업무일지<Depth Write>  (0) 2023.03.27
업무일지<게임 맛보기>  (0) 2023.03.21
업무일지 <GC효과>  (0) 2023.03.10
업무일지<GC(garbage collector)>  (2) 2023.03.09
업무일지 <유저테스트준비중>  (0) 2023.03.03

ChatGPT를 이용하여, 간단하게 특정위치에서 버튼을 5초마다 누르고, s키를 2초 후에 누르도록 스크립트를 짜도록 요청하였습니다. 잘 작동하네요.

#SingleInstance force

Gui, Add, Button, x50 y50 w100 h50 gRunButton, Run

Gui, Show, w200 h150, My GUI

global continueRunning := true ; Set a global variable to keep track of whether the script should continue running

RunButton:
SetTimer, ImageTimer, 5000 ; Set timer to trigger ImageTimer label every 5 seconds
return

ImageTimer:
ImageSearch, FoundX, FoundY, 0, 0, A_ScreenWidth, A_ScreenHeight, *50 C:\Path\To\Your\Image.png
if(ErrorLevel = 0) ; If the image is found
{
    MouseClick, left, %FoundX%, %FoundY% ; Click at the location of the image
}
if(!continueRunning) ; If continueRunning is false, exit the timer
{
    SetTimer, ImageTimer, Off
    return
}
return

Pause::
continueRunning := false ; Set the global variable to false to stop the script
return

GuiClose:
continueRunning := false ; Set the global variable to false to stop the script when the GUI window is closed
ExitApp ; Exit the script
return

(GC)가비지 컬렉터의 효과는 유니티상에서는 있어 보였지만, 실제로 게임에서는 그다지 효과가 나타나질 않았습니다.

빌드가 잘못된거 아닌가해서 다시 확인하였지만... 똑같군요.

역시 빌드를 해서 직접확인을 해야지, 수치만으로는 믿을 수 없습니다.

좀 아쉽긴 하지만, 그래도 적용하는게 좋을거 같습니다.

 

테스트등록을 시작하였네요.

'업무일지' 카테고리의 다른 글

업무일지<게임 맛보기>  (0) 2023.03.21
업무일지 <젠킨스 재구성>  (0) 2023.03.16
업무일지<GC(garbage collector)>  (2) 2023.03.09
업무일지 <유저테스트준비중>  (0) 2023.03.03
업무일지<shaderloader>  (0) 2023.02.24

Player 세팅에 보면 GC(garbage collector)에 대한 옵션이 있습니다.

이게 활용에 따라 독이 될 수도 있고, 득이 될 수도 있다고 합니다.

게임을 테스트 해봤는데, GC를 킨 경우 프레임이 잘 관리가 되고 있는 거 같네요.

실제 빌드로 테스트를 해보기로 하였습니다.

'업무일지' 카테고리의 다른 글

업무일지 <젠킨스 재구성>  (0) 2023.03.16
업무일지 <GC효과>  (0) 2023.03.10
업무일지 <유저테스트준비중>  (0) 2023.03.03
업무일지<shaderloader>  (0) 2023.02.24
업무일지<Memory>  (0) 2023.02.17

유저 테스트를 준비하고 있습니다.
모니터별 밝기가 다르고 사람마다 시각적인 차이가 있다고 하여 감마 보정하는 걸 넣기로 하였습니다.
근데 gamma 보다는 밝기는 gain이 더 나은 거 같은데 중국에서 감마로 하자고 하니 그렇게 하기로...
각 스테이지마다 볼륨을 넣는 건 좀 번거로운 일이라 씬로더에  감마를 조종하기 위한 볼륨을 추가하여 어느 스테이지를 오픈하더라도 문제없게 구성하였습니다.

'업무일지' 카테고리의 다른 글

업무일지 <GC효과>  (0) 2023.03.10
업무일지<GC(garbage collector)>  (2) 2023.03.09
업무일지<shaderloader>  (0) 2023.02.24
업무일지<Memory>  (0) 2023.02.17
업무일지<Tree / Occlusion>  (0) 2023.02.13

머터리얼 컬렉터를 수정하였습니다. 중복된 오브젝트가 많아서 소요되는 로드시간을 수정할 필요가 있다고 생각했습니다.

추가적으로 어떤 오브젝트들이 중복되었는지 출력하도록 코드를 수정하였습니다.(AI 도움을 받았습니다.ChatGPT짱!!)

 

더보기
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using TMPro;
using UnityEditor;
using UnityEngine;

#if UNITY_EDITOR

[CustomEditor(typeof(ShaderLoader))]
public class ShaderLoaderEditor : Editor
{
    ShaderLoader ShaderLoaderThis;
    public void OnEnable()
    {
        ShaderLoaderThis = target as ShaderLoader;
    }
    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();

        if (GUILayout.Button("Create Shader Object") == true)
        {
            ShaderLoaderThis.CreateShaderSphere();
        }

        if (GUILayout.Button("Remove Duplicate Objects") == true)
        {
            ShaderLoaderThis.RemoveDuplicateObjects();
        }
    }
}

public class ShaderLoader : MonoBehaviour
{

    public GameObject IngameField;
    [SerializeField]
    public List<string> PathList;
    [SerializeField]
    public GameObject PathString;
    [SerializeField]
    public GameObject PathObjectStore;
    // Start is called before the first frame update
    [SerializeField]
    float PosfirstX = -20.31f;
    [SerializeField]
    float PosfirstZ = 3.94f;
    float Gap = 1.5f;
    int CountCol = 12;
    int CountRow = 12;
    void Start()
    {
        CreateShaderSphere();
    }

    public void CreateShaderSphere()
    {
        int numberRow = 0;
        var ingamepos = GameObject.Find("Ingame");
        if (PathObjectStore != null)
            DestroyImmediate(PathObjectStore);
        PathObjectStore = new GameObject();
        PathObjectStore.name = "OBJStore";
        PathObjectStore.transform.SetParent(ingamepos.transform);
        for (int i = 0; i < PathList.Count; i++)
        {
            List<Material> paths = new List<Material>();
            GetDirectoriesRecursive(PathList[i], ref paths);
            //var pathString = Instantiate(PathString);
            //pathString.GetComponent<TextMeshPro>().text = PathList[i].ToString();
            //pathString.GetComponent<TextMeshPro>().alignment = TextAlignmentOptions.BottomRight;
            //pathString.transform.position = new Vector3(PosfirstX - 5f, 0f, PosfirstZ + -Gap * numberRow);
            //pathString.transform.SetParent(PathObjectStore.transform);
            for (int j = 0; j < paths.Count; j++)
            {
                var sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);
                sphere.GetComponent<Renderer>().material = paths[j];
                numberRow = (j / CountRow);
                sphere.transform.position = new Vector3(PosfirstX + Gap * (j % CountCol), 0f, PosfirstZ + -Gap * numberRow);
                sphere.name = paths[j].name;
                sphere.transform.SetParent(PathObjectStore.transform);
            }
            numberRow++;
        }
    }


    public void RemoveDuplicateObjects()
    {
        var allObjects = PathObjectStore.GetComponentsInChildren<Transform>();
        var duplicates = new List<Transform>();
        var names = new HashSet<string>();
        var duplicateNames = new List<string>();

        for (int i = 0; i < allObjects.Length; i++)
        {
            if (names.Contains(allObjects[i].name))
            {
                duplicates.Add(allObjects[i]);
                duplicateNames.Add(allObjects[i].name);
            }
            else
            {
                names.Add(allObjects[i].name);
            }
        }

        // Keep the first object of each group and delete the rest
        for (int i = 1; i < duplicates.Count; i++)
        {
            DestroyImmediate(duplicates[i].gameObject);
        }

        // Save the list of duplicate object names to a text file
        if (duplicateNames.Count > 0)
        {
            string dateTimeString = DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss");
            var filePath = "Assets/InGame/Scenes/SamapleShader/duplicate_names_" + dateTimeString + ".txt";
            using (StreamWriter writer = new StreamWriter(filePath))
            {
                writer.WriteLine("Duplicate object names:");
                foreach (var name in duplicateNames)
                {
                    writer.WriteLine(name);
                }
            }
        }

    }




    // Update is called once per frame
    void Update()
    {

    }

    static private void GetDirectoriesRecursive(string path, ref List<Material> list)
    {

        string[] guids = UnityEditor.AssetDatabase.FindAssets("t:material", new string[] { path });
        List<UnityEngine.Object> returnval = new List<UnityEngine.Object>();
        Dictionary<string, int> overlapchacker = new Dictionary<string, int>();
        for (int i = 0; i < guids.Length; i++)
        {
            if (overlapchacker.ContainsKey(guids[i]))
                continue;
            overlapchacker.Add(guids[i], 1);
            var datas = UnityEditor.AssetDatabase.LoadAllAssetsAtPath(UnityEditor.AssetDatabase.GUIDToAssetPath(guids[i]));
            foreach (var data in datas)
            {
                if (data is Material)
                {
                    list.Add(data as Material);
                }
            }

        }

    }

}
#endif

'업무일지' 카테고리의 다른 글

업무일지<GC(garbage collector)>  (2) 2023.03.09
업무일지 <유저테스트준비중>  (0) 2023.03.03
업무일지<Memory>  (0) 2023.02.17
업무일지<Tree / Occlusion>  (0) 2023.02.13
업무일지<어드레서블 시스템>  (0) 2023.02.01

원화를 기반으로 실사화시켜보고 있습니다.

허리에 옷을 두르는게 콘셉트인데, 잘되질 않습니다. 아직 내공이 많이 부족하군요.

'AI' 카테고리의 다른 글

로고 만들기 (stable-diffusion-webui)  (0) 2023.04.28
여자 히어로 (stable-diffusion-webui)  (0) 2023.04.13
여자모델 (stable-diffusion-webui)  (0) 2023.04.05
AutoHotkey와 ChatGPT  (0) 2023.03.14
Image To Image (stable-diffusion-webui)  (0) 2023.02.09