젠킨스쪽 다시 구성중.

 

젠킨스명령:  

-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

항상 처음부터 메모리 부터 봐야하는데, 이상하게 자주 착각을 한다 메모리는 문제 없을거라는...

항상 맨 먼저 확인해야하는 버릇이 필요하군요. 줄여지가 꽤 있었군요..

 

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

업무일지 <유저테스트준비중>  (0) 2023.03.03
업무일지<shaderloader>  (0) 2023.02.24
업무일지<Tree / Occlusion>  (0) 2023.02.13
업무일지<어드레서블 시스템>  (0) 2023.02.01
업무일지<Terrain을 수동으로>  (0) 2023.01.19

숲지역의 경우는 나무의 폴리곤 양이 많고 나무 간 밀도가 높기 때문에 Batches와 Shadow casters의 수치가 높습니다.

SetPass calls도 높습니다. 포퍼먼스에 상당한 영향이 있습니다.ㅠㅠ

이걸 최적화하는건 참 쉬움 일이 아닙니다.

우선은, Occlusion을 이용하여 보이지 않을 물체들을 그리지 않게 합니다. (의미 없는 스테이지도 있긴 합니다.)

Occlusion 적용전
bake
Occlusion이 적용된 상태

그리고, 시야에서 멀리는 물체에 LOD에 그림자가 생기지 않도록 만들었습니다.

그리고, GPU인스턴스를 이용해서 배치수를 줄이는 작업을 진행하였습니다.

이렇게 하니, 절반 정도 줄어들었군요.

그림자가 없어짐으로써 자칫 퀄리티가 떨어지는 문제가 있기 때문에 이 부분도 많이 신경을 써야 합니다.

아직도 갈길이 멀군요.

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

업무일지<shaderloader>  (0) 2023.02.24
업무일지<Memory>  (0) 2023.02.17
업무일지<어드레서블 시스템>  (0) 2023.02.01
업무일지<Terrain을 수동으로>  (0) 2023.01.19
업무일지<Terrain To mesh>  (0) 2023.01.17

아이가 그린 그림을 기반으로 생성해봤습니다.

'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
여자모델 (stable-diffusion-webui)  (0) 2023.02.22