public class NPC_Animation : MonoBehaviour
{
    Animator anim;

    // Start is called before the first frame update
    void Start()
    {
        anim = GetComponent<Animator>();
        anim.applyRootMotion = false;//humanoid에서 캐릭터 위치가 바뀌는것을 방지한다.
        
    }

    // Update is called once per frame
    void Update()
    {
        int pickAnumber = Random.Range(1, 6);
        anim.SetInteger("ani", pickAnumber); //ani라는 int를 animator에 추가

    }
}

캐릭터의 모션 파라미터 타입을 int로 설정한후에 랜덤으로 동작하게 만들었습니다.

'Unity > C#' 카테고리의 다른 글

유니티의 Object 이해  (0) 2020.12.06
Scene 재시작  (0) 2020.11.21
EditorWindow  (0) 2020.10.30
간단한 애니메이션 스크립트  (0) 2020.09.08
C# 기초 기억창고  (0) 2020.08.09

애초 surface shader로 제작을 하였으나, 혹시 URP로 넘어갈것을 대비해야될거 같아서

Amplify shader로 만들어놨습니다. 확실히...코드로 짠거보다 복잡한 모양새군요.

'Unity > Shader Graph & Amplify' 카테고리의 다른 글

sign값을 이용한 포지션 이동  (0) 2020.11.18
Amplify Shader 주요 기능  (0) 2020.11.04
Shader graph-input03  (0) 2020.07.12
Shader graph-input02  (0) 2020.06.29
Shader graph -input01  (0) 2020.06.11
using UnityEngine;
using UnityEditor;
using System.Collections;

public class ryo_dir : EditorWindow
{
    [MenuItem("ZCustom/ryo_direct",false, priority:1)]//메뉴생성


    static void ShowWindow()
    {
        // 생성되어있는 윈도우를 가져온다. 없으면 새로 생성한다. 싱글턴 구조인듯하다
        ryo_dir window = (ryo_dir)EditorWindow.GetWindow(typeof(ryo_dir));

    }

    public string ABB;
    int BoxMaker=1;
    Object GoObject = null;
    Object SceneObject3 = null;

    void OnGUI()
    {
        ABB = EditorGUI.TextField(new Rect(10,10,300,17), "글자써봐", ABB);

        
        //버튼으로 오브젝트 실행
        BoxMaker = EditorGUI.IntField(new Rect(10, 30, 300, 17), "게임오브젝트", BoxMaker);

        if (GUI.Button(new Rect(100, 80, 80, 40), "BoxMaker"))
        {
            for (int i = 0; i < BoxMaker; i++)
            {
                GameObject obj = new GameObject();
                obj.name = "GameObject" + i;
            }
 
        }

        //버튼 위치보기
        GUI.Button(new Rect(100, 140, 80, 40), "Button2");  // 가로위치,세로위치,박스세로, 박스가로


        //버튼 띄우기
        GUILayout.Space(200);
        
        
        //오브젝트필드
        GoObject = EditorGUILayout.ObjectField("오브젝트넣기", GoObject, typeof(GameObject));
  
  		//씬넣기
        GUILayout.Space(5);
        SceneObject3 = EditorGUILayout.ObjectField("씬넣기", SceneObject3, typeof(SceneAsset));

    }

    // 또하나의 탭만들기
    [MenuItem("ZCustom/ryo_what2",false,priority:2)]
    static void Twwoo()
    {
        

    }

}

이것저것 모아봤습니다.

'Unity > C#' 카테고리의 다른 글

Scene 재시작  (0) 2020.11.21
캐릭터 랜덤 모션  (0) 2020.11.02
간단한 애니메이션 스크립트  (0) 2020.09.08
C# 기초 기억창고  (0) 2020.08.09
MiniPorfiler  (0) 2020.07.29

뭔가 써먹으려고 만들었지만 써먹지 못한...

rhy_01.shader
0.00MB

 

 

 

뭔가 써먹으려고 만들었지만 써먹지 못한...

rhy_02.shader
0.00MB

 

'Unity > Surface Shader' 카테고리의 다른 글

가벼운 툰 셰이더  (0) 2020.12.16
가짜 리플렉션  (0) 2020.11.10
Alpha  (0) 2020.05.24
RampTexture  (0) 2020.05.21
OUTLINE  (0) 2020.05.17

같은 조건에서 복사된 오브젝트와 attach 한 오브젝트의 stats를 비교 테스트진행하였습니다.

역시나, attach한것이 훠얼~씬 효과적임을 나타냅니다.

 

똑같이 URP에서 테스트 하였고 결과는 비슷했습니다. 다만, URP는  격차가 좀 덜 하네요.

tris가 차이가 나는건 쉐이더가 다르기때문이라 판단됩니다.

'Unity > ETC' 카테고리의 다른 글

Memory Profiler  (0) 2020.11.10
코딩을 도와주는 비쥬얼스크립트  (0) 2020.11.10
유니티 패키지에 대한 정보는  (0) 2020.09.08
dynamic bone test  (0) 2020.08.21
RealToon Tutorials  (0) 2020.07.29

svn을 사용하다보면 유니티 패키지에 대한 정보까지 안올라가는 경우가 있습니다.

그렇다고 라이브러리를 통째로 업데이트할수 없습니다.

하여, pagckages폴더 안에 packages-lock.json을 올리면 패키지가 없는 사람은 자동으로 유니티가 받게 합니다.

 

'Unity > ETC' 카테고리의 다른 글

코딩을 도와주는 비쥬얼스크립트  (0) 2020.11.10
복사 오브젝트와 Attach 오브젝트의 포퍼먼스 차이  (0) 2020.09.29
dynamic bone test  (0) 2020.08.21
RealToon Tutorials  (0) 2020.07.29
유니티짱 쉐이더 설정  (0) 2020.07.29
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class test_ani : MonoBehaviour
{
    Animator m_Animator;

    void Start()
    {
        //오브젝트에 넣는부분
        m_Animator = gameObject.GetComponent<Animator>();
    }

    void Update()
    {
        //트러거에 원하는 키패드를 넣고. 애니메이션 트리거 이름을 넣음 된다.
        if (Input.GetKey(KeyCode.Keypad0))
        {
            
            m_Animator.SetTrigger("sliding");
        }

        if (Input.GetKey(KeyCode.Keypad1))
        {
            
            m_Animator.SetTrigger("fall");
        }

        if (Input.GetKey(KeyCode.Keypad2))
        {
            
            m_Animator.SetTrigger("catch");
        }

        if (Input.GetKey(KeyCode.Keypad3))
        {
            
            m_Animator.SetTrigger("kick");
        }

        if (Input.GetKey(KeyCode.Keypad4))
        {
            
            m_Animator.SetTrigger("win");
        }

        if (Input.GetKey(KeyCode.Keypad5))
        {
            
            m_Animator.SetTrigger("jump");
        }


    }
}

넘버키를 누르면 해당되는 애니메이션이 발동하도록 짠 스크립트 입니다.

Animator가 물론 존재해야한다.

 

 

'Unity > C#' 카테고리의 다른 글

캐릭터 랜덤 모션  (0) 2020.11.02
EditorWindow  (0) 2020.10.30
C# 기초 기억창고  (0) 2020.08.09
MiniPorfiler  (0) 2020.07.29
object rotate by tag  (0) 2020.07.29

한동안 URP에 맹신하고 그쪽으로 개발을 하던중에 개발자의 뭔가 이상하다는 소리에 머리가 하얗게되었습니다.

저는 신규 게임 개발 초기때부터 URP를 써야한다고 저는 계속 주장을 하였습니다.

유니티코리아에서도 URP 포퍼먼스 향상에 대해서 자주 언급이 있었고, 실제 테스트한 내용들을 보았기 때문에

그에 대한 기대감이 있었습니다. 헌데, 실제 개발에는 차이가 있었습니다. 

 

우리 프로젝트는 RPG와 달리 씬에 등장하는 캐릭터가 수가 적고, 배경도 한화면에 한번에 뿌려지는 방식이다보니...

URP를 사용하는것이 오히려 더 무거웠습니다.

URP가 오히려 무겁고 포퍼먼스를 저해할수 있다는데 약간 놀랐습니다.

실제로 같은 환경에서 FPS속도를 보았는데, 30프레임가량 차이가 나더군요.

결론은 레거시로 돌리는걸로 이야기가 되었습니다.

많은 의문점을 남기고 다시 이전 쉐이더 방식으로 돌아갔습니다.

아직 더 연구가 필요하겠지만, 프로젝트마다 취해야할 쉐이더 방식이 다른거 같습니다.

URP나 HDRP를 맹신하면 안될거 같습니다.


위 내용에 대한 궁금증이 해결이 되었습니다.

테스트하였던 배경과 캐릭터의 문제였습니다.

URP로 변경하면서 배경의 경우 텍스쳐 한장과 하나의 폴리곤으로 구성되어있다보니 너무 단순한 구조이고,

지나치게 가벼워서 URP가 오히려 무겁게 되버렸던겁니다.

또하나는 캐릭터 쉐이더를 외부에서 만든 쉐이더를 차용했는데, SBR Bacher가 되질 않아서 무거워지면서

URP의 변경하면서 아무런 이득을 취하지 못해서였습니다.

 

이제 속이 후련하군요...ㅎ

'Unity > URP' 카테고리의 다른 글

StylizedLitShader을 약간의 변경...  (0) 2021.10.08
unlit shader에 SRP batcher를 넣어봅시다.  (0) 2021.10.06
Project Settings  (0) 2021.09.28
URP 트레이닝 기초  (0) 2021.05.26
URP를 써야하는 이유.  (0) 2020.06.10

정리중..

-  Unity 작동 환경을 지원하려면 GeForce GTX 1080 TI 이상의 그래픽 카드를 사용하는 것이 좋습니다.

 

 

find / name / print

void start(){
    GameObject monster = GameObject.Find("Cube");
    GameObject koko = GameObject.Find("Cube");
    
    monster.name = "Orc";
    
    print(koko.name);
    }

결과 = orc

 

 

Public -스크립트 외부에서 수치를 변경이 가능해진다.

[Sytem.NonSerialized] - public 변수를 외부에서 변경을 못하게 한다. 

(애초에 public으로 안하면 될것을 왜이리 하는지 알수는 없지만...나중에 알게되겄지...)

public int myAge =10;

[Sytem.NonSerialized]
public int myAge =10;

void start(){
	print (myAge);
    }
    

결과 = 10 이거나 외부에서 넣은 수치

 

 

변수사용

int gogo =10;

void start(){
    print("who is"+ gogo);
    print("what is"+ gogo);
    print("where is"+ gogo);
    }
    
   

결과 = who is 10 , what is 10 , where is 10

 

void 활용영역

void는 공허(빈)라는 뜻이고 함수를 만드는데 사용된다. 함수는 ()가 있으며 가능하면 함수명 앞은 대문자로 한다.

void Start(){
	GoGo();
    GoGo();
    GoGo();
    GoGo();    
    }
    
void GoGo(){
    print ("What");
    print ("How");
    print ("YEA");
    }

결과 = what How YEA, what How YEA, what How YEA

 

int intOk; // intOk라는 정수형 변수를 만든다.
float Afloat = 10.5f //Afloat라는 실수형을 만들고 그 값을 10.5라고 넣는다.
float Bfloat = 9.5f //Bfloat라는 실수형을 만들고 그 값을 9.5라고 넣는다.

void FloatToint() //FloatToint라는 함수를 만든다.
{
}

void FloatToint(flaot _Af, float _Bf, String _TEX = "디폴트") //()안에는 입력받을 것을 넣는데 사용된다.
// _TEX에 넣을것이 없을때 디폴트라는 글자를 출력한다.
{
	intOk =(int)(_Af+_Bf); //_Af과 _Bf 더한것을 int정수형으로 변경하여, intOK에 담는다.
    print(intOk); //intOK를 출력한다.
    print(_TEX);
    
}

void Start() // 유니티에서 첫번째 실행하는 함수이다.
{
	FloatToint(Afloat,Bfloat, "Good"); // Afloat은 _Af에 들어가게 되고, Bfloat은 _Bf에 들어가게된다.
                                       // Good은 _TEX안에 들어가게 된다.
}

 

 

retrun 은 void를 사용하지 않는 함수를 사용할때 필요하다.

void Start(){
     int yourAge = GetYourAge();
     print(yourAge);    
     }
     
     
int GetYourAge(){
    return 30;
    }

결과 = 30

 

오버로딩

void Start(){
   int answerInt = AddTo(12,2);
   int answerInt2 = AddTo(2,4,6);
   float answerFloat = AddTo(5.2f,2f);
   
   print(answerFloat);
  
}

int AddTo(int numA, int numB){
    int sum = numA +numB
    return sum;
}

int AddTo(int numA, int numB, int numC){
    int sum = numA + numB + numC
    return sum;
}




float AddTo(float numA, float numB){
    float sum = numA +numB
    return sum;
}

결과 = 7.2

 

조건문

int hp =100;

void Start(){
}

void OnMouseDonw(){
     hp = hp-10;
     
     if(hp < 1){
         print("killed")
         print("HP:" +hp);
         Destroy(gameObject);
         
     }else if(hp<20){
         print("hurt...");
         print("HP:" +hp);
     
     }else{
         print("OK");
         print("HP:" +hp);
         }
    }

 

Switch문

pulbic int myHp= 50;

void Start(){
   }

vod OnMouseDonw(){
   case 10:
      print("NONO")
      break;
   case 20:
      print("NO")
      break;
   case 30:
      print("more")
      break;
   default:
      print("OK")
      break;
      
  }

결과 = OK

 

for 와  while (Loop문)

------ for ------ 반복횟수가 명확할때 주로 사용한다.

for (시작수:언제까지:증가수)

void Start(){
}

void OnMouseDown(){
    for( int i =0 ; i<10 ; i++){
        MoveForward();
    }
}

void MoveForward(){
        transform.Translate(0, 0, 0.1f);
}

다른 응용법
<<<<
int add = 0; // 시작수

void Start()
{

	for(;;) // ;만 남기고 나머지는 따로 처리하는 방식
	{
	if(add>5) // 언제까지
		break; // if 멈춤
    num = add+2; //(add +=2) 증가수
    }
}
>>>>>

------ while ------ 반복횟수가 명확하지 않을때 주로 사용한다.(어찌되었건 비슷하다.)

    void OnMouseDown()
    {
        int count = 0;
        while (count < 10)
        {
            MoveForward();
            count++;
        }
    }

    void MoveForward()
    {
        transform.Translate(0, 0, 0.1f);
    }

배열

int[ ] numbers = new int[5];

void Start(){
     numbers[0]=6;
     numbers[1]=2;
     numbers[2]=11;
     numbers[3]=3;
     numbers[4]=9;

     print(numbers[3]);
}

------ public ------

    public int[] numb;

    void Start()
    {
    }

    void OnMouseDown()
    {
        print(numb[numb.Length - 1]);
    }

void Start(){
    int[] points = {10,20,30,40};
    
    int sum = 0;// 무언가 우선 들어있어야한다.
    for(int i=0; i<point.Lenght;i++)
    { sum +=points[i]; }
    
    int average = sum / points.Length;
    Debug.Log(average);
    }
    

결과: 25

 

new 와 static

new는 클래스의 변수를 사용할때 재지정하여 사용하는것.

Static은 클래수의 변수에 직접 변수를 넣어서 사용하는것.

public class TestA
{
	private int a;
    public int b; // 이 부분을 활용.
    public static int c; // static처럼 외부에서 직접 사용되는 변수를 정적변수라고 한다.
}

public class Test : MonoBehaviour
{
	TestA a1 = new TestA(); //위에 클래스의 변수를 새로 지정해야 정상적으로 작동한다.
    TestA a2 = new TestA();
    TestA a3 = new TestA();
    
    void Start()
    {
    	Abc();    
    }
    
    void Abc()
    {
    a1.b = 5; // 클래스에 접근하여 수를 대입하는 방식이다.
    a2.b = 1;
    a3.b = 10;
    
    TestA.c = 20; // static의 경우 new를 사용하지 않고 직접 대입할수 있다. 클래스 자체를 수정하는것이다.
    //변수를 만들 필요가 없이 직접 대입한다.
    
    print(a1.b);
    print(a2.b);
    print(ac.b);
    print(TestA.c);
    
    
    }
    
    
}

'Unity > C#' 카테고리의 다른 글

캐릭터 랜덤 모션  (0) 2020.11.02
EditorWindow  (0) 2020.10.30
간단한 애니메이션 스크립트  (0) 2020.09.08
MiniPorfiler  (0) 2020.07.29
object rotate by tag  (0) 2020.07.29

유니티 보트어텍에 들어있는 포퍼먼스 테스트터 입니다.

using UnityEngine.Profiling;
using UnityEngine.Rendering;

namespace UnityEngine.Experimental.Rendering
{
    public class MiniProfiler : MonoBehaviour
    {
        private bool m_Enable = true;
        private const float kAverageStatDuration = 1.0f;            // stats refresh each second
        private int m_frameCount;
		private float m_AccDeltaTime;
        private string m_statsLabel;
        private GUIStyle m_style;

        private float[] m_frameTimes = new float[5000];
        private int m_totalFrames = 0;
        private float m_minFrameTime = 1000f;
        private float m_maxFrameTime = 0f;

        internal class RecorderEntry
        {
            public string name;
            public int callCount;
            public float accTime;
            public Profiling.Recorder recorder;
        };

		enum Markers
		{
			kRenderloop,
			kCulling,
            kShadows,
            kDraw,
            kPost,
		};
		
        RecorderEntry[] recordersList =
        {
			// Warning: Keep that list in the exact same order than SRPBMarkers enum
            new RecorderEntry() { name="UnityEngine.CoreModule.dll!UnityEngine.Rendering::RenderPipelineManager.DoRenderLoop_Internal()" },
            new RecorderEntry() { name="CullScriptable" },
            new RecorderEntry() { name="Shadows.ExecuteDrawShadows" },
            new RecorderEntry() { name="RenderLoop.ScheduleDraw" },
            new RecorderEntry() { name="Render PostProcessing Effects" },
        };

        void Awake()
        {
            for (int i = 0; i < recordersList.Length; i++)
            {
                var sampler = Sampler.Get(recordersList[i].name);
                if (sampler.isValid)
                    recordersList[i].recorder = sampler.GetRecorder();
            }

            m_style =new GUIStyle();
            m_style.fontSize = 18;
            m_style.normal.textColor = Color.white;

            ResetStats();

        }

        void RazCounters()
        {
            m_AccDeltaTime = 0.0f;
            m_frameCount = 0;
            for (int i = 0; i < recordersList.Length; i++)
            {
                recordersList[i].accTime = 0.0f;
                recordersList[i].callCount = 0;
            }
        }

        void    ResetStats()
        {
             m_statsLabel = "Gathering data...";
             RazCounters();
        }

        void Update()
        {
            if (m_Enable)
            {
                m_AccDeltaTime += Time.unscaledDeltaTime;
                m_frameCount++;

                m_frameTimes[(int) Mathf.Repeat(m_totalFrames, 5000)] = Time.unscaledDeltaTime;

                int frameFactor = Mathf.Clamp(m_totalFrames, 0, 5000);

                float m_averageFrameTime = 0f;
                
                for (int i = 0; i < frameFactor; i++)
                {
                    m_averageFrameTime += m_frameTimes[i];
                }

                if (m_frameCount > 10)
                {
                    m_minFrameTime = Time.unscaledDeltaTime < m_minFrameTime ? Time.unscaledDeltaTime : m_minFrameTime;
                    m_maxFrameTime = Time.unscaledDeltaTime > m_maxFrameTime ? Time.unscaledDeltaTime : m_maxFrameTime;
                }

                // get timing & update average accumulators
                for (int i = 0; i < recordersList.Length; i++)
                {
                    if (recordersList[i].recorder != null)
                    {
                        recordersList[i].accTime += recordersList[i].recorder.elapsedNanoseconds / 1000000.0f;      // acc time in ms
                        recordersList[i].callCount += recordersList[i].recorder.sampleBlockCount;
                    }
                }

				if (m_AccDeltaTime >= kAverageStatDuration)
				{

					float ooFrameCount = 1.0f / (float)m_frameCount;
					float avgLoop = recordersList[(int)Markers.kRenderloop].accTime * ooFrameCount;
					float avgCulling = recordersList[(int)Markers.kCulling].accTime * ooFrameCount;
					float avgShadow = recordersList[(int)Markers.kShadows].accTime * ooFrameCount;
					float avgDraw = recordersList[(int)Markers.kDraw].accTime * ooFrameCount;
					float avgPost = recordersList[(int)Markers.kPost].accTime * ooFrameCount;

					m_statsLabel = $"Rendering Loop Main Thread:{avgLoop:N}ms\n";
					m_statsLabel += $"    Culling:{avgCulling:N}ms\n";
					m_statsLabel += $"    Shadows:{avgShadow:N}ms\n";
					m_statsLabel += $"    Draws:{avgDraw:F2}ms\n";
					m_statsLabel += $"    PostProcessing:{avgPost:F2}ms\n";
					m_statsLabel += $"Total: {(m_AccDeltaTime * 1000.0f * ooFrameCount):F2}ms ({(int)(((float)m_frameCount) / m_AccDeltaTime)} FPS)\n";
                    
                    float frameMulti = 1f / frameFactor;
                    m_statsLabel += $"Average:{(m_averageFrameTime * 1000f * frameMulti):F2}ms\n";
                    m_statsLabel += $"Minimum:{m_minFrameTime * 1000f:F2}ms\n";
                    m_statsLabel += $"Maximum:{m_maxFrameTime * 1000f:F2}ms\n";
                    
					RazCounters();
				}
            }

            m_totalFrames++;
        }

        void OnGUI()
        {
            if (m_Enable)
            {
                bool SRPBatcher = UnityEngine.Rendering.Universal.UniversalRenderPipeline.asset.useSRPBatcher;

//                GUI.skin.label.fontSize = 15;
                GUI.color = new Color(1, 1, 1, 1);
                float w = 400, h = 300;

                if ( SRPBatcher )
                    GUILayout.BeginArea(new Rect(32, 50, w, h), "(SRP batcher ON)", GUI.skin.window);
                else
                    GUILayout.BeginArea(new Rect(32, 50, w, h), "(SRP batcher OFF)", GUI.skin.window);

                GUILayout.Label(m_statsLabel, m_style);

                GUILayout.EndArea();
            }
        }
    }
}

'Unity > C#' 카테고리의 다른 글

캐릭터 랜덤 모션  (0) 2020.11.02
EditorWindow  (0) 2020.10.30
간단한 애니메이션 스크립트  (0) 2020.09.08
C# 기초 기억창고  (0) 2020.08.09
object rotate by tag  (0) 2020.07.29

매번 물체에 회전을 넣기가 귀찮아서... 어렵사리 코딩하였습니다.(코딩은어려버.)

Tag를 설정하고, Y축으로 회전합니다.

 

쉐이더 테스트할때 사용하려고 만든겁니다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class rotate_tag : MonoBehaviour
{
    
    //Rotational Speed
    public float speed = 20f;



    //object

    GameObject[] objt;


    void Start()
    {
        objt = GameObject.FindGameObjectsWithTag("gogo");

    }


    //Forward Direction

    bool ForwardY = true;

    
    void _All()
    {

        for(int i = 0; i < objt.Length; i++)
        {
            objt[i].transform.Rotate(0, Time.deltaTime * speed, 0, Space.Self);

        }
                 
    }



    void Update()
    {
        //Forward Direction

        if (ForwardY == true)
        {

            _All();
            
        }


    }
}

'Unity > C#' 카테고리의 다른 글

캐릭터 랜덤 모션  (0) 2020.11.02
EditorWindow  (0) 2020.10.30
간단한 애니메이션 스크립트  (0) 2020.09.08
C# 기초 기억창고  (0) 2020.08.09
MiniPorfiler  (0) 2020.07.29

https://www.youtube.com/playlist?list=PL0M1m9smMVPJ4qEkJnZObqJE5mU9uz6SY

 

RealToon Tutorials

 

www.youtube.com

강제 스페큘러가 있고, 일반적인 스페큘러가 안된다는 아쉬움있지만 쓸만하다.

컨셉에 따라 사용하면될듯하다.

'Unity > ETC' 카테고리의 다른 글

유니티 패키지에 대한 정보는  (0) 2020.09.08
dynamic bone test  (0) 2020.08.21
유니티짱 쉐이더 설정  (0) 2020.07.29
캐릭터 폴리곤  (0) 2020.07.29
모델 데이터 최적화  (0) 2020.05.20

t is number of actors * number of bones per actor.

A decent number of bones per a humanoid character would be …

2 upper leg bones + 2 lower leg bones + 2 feet bones + 2 toe bones + 30 finger bones (3 bones per finger) + 2 upper arm bones + 2 lower arm bones + hip bone + 3 spine bones + 2 shoulder bones + 1 neck bone + 1 head bone = 50.

The number can go much higher. For example, highly detailed models in Guilty Gear Xrd Sign have up to 400 or 500 bones.

So, for 24 characters onscreen you could easily have 1500 bones active.

Here’s a thing, though. Those bones are not necessarily represented as a full-blown game objects, and might not be stored as matrix transform driven by animation. Meaning, you might see a 20 characters, but have no “bone” objects on screen. Of course, if you have 20 ragdolls, then you’ll have 18..20+rigidbodies per character (because it is unlikely that fingers will be driven by ragdolls)

But either way 1500+ matrix multiplications on modern system is cheap. Now, if you want to have few thousands characters onscreen, optimization techniques will be necessary.

 

I remember Crytek’s Ryse saying each character had 770 bones (at full LOD), with the faces having 260 alone. Though this is Crytek we’re talking about.

 

I know ~120 bone characters work in unity/ios, if that helps.

 

 

외국애들이 떠드는걸 봐서 확실히 다 다르지만... 기본 50에서 대략 보편적으로 100개로 잡아보자..

PS2 파판: 8,000폴리곤


PS3 메기솔 4: 1.4만폴리곤 /스테이지는 스테이지 별로 25만-35만폴리곤

 

갓오브워 3:  크레이토스 2.3만폴리곤 / 하데스 3만폴리곤 / 가이아 6.5만폴리곤

 

파이날판타지 13: 3만폴리곤 (PS2에 8,000폴리곤)

 

언차티드 2: 네이트 드레이크 8만폴리곤

 

 

출처:https://bbs.ruliweb.com/ps/board/300001/read/314046

'Unity > ETC' 카테고리의 다른 글

RealToon Tutorials  (0) 2020.07.29
유니티짱 쉐이더 설정  (0) 2020.07.29
모델 데이터 최적화  (0) 2020.05.20
최적화에 대한  (0) 2020.05.17
잡다한..  (0) 2020.05.16

행열: 버텍스와 계산을 할때 사용한다고 한다.

 

Direct Specular: 물체 극성을 주는것이라고하는데, 물이나 굴절같은데 쓴다고 한다. 

 

Metal Reflectance: 미리 설정된 금속 반사율 이다. specular나 Albedo에 넣어서 활용할수 있다.

 

Camera: 

 

Fog: 안개로 멀어질수록 밀도가 높아짐.

 

Object: 물체에 Transform에서 값을 참조한다.

Scene Color:  화면을 캡쳐하는 기능이다.

Scene Depth:

 

유니티는 화면을 그릴때  불투명(opaque)을 먼저 그리고 Zbuffer 저장 그리고 투명 순으로 그린다.

'Unity > Shader Graph & Amplify' 카테고리의 다른 글

Amplify Shader 주요 기능  (0) 2020.11.04
툰 쉐이더 Amplify shader set  (0) 2020.11.02
Shader graph-input02  (0) 2020.06.29
Shader graph -input01  (0) 2020.06.11
Shader graph -channel01  (0) 2020.06.10

Vertex Color(메쉬의 버텍스 컬러를 이용한 텍스쳐 겹치기 방법:배경 바닥에서 주로 사용된다.)

View Direction - 카메라가 보는 방향

Gradient - 컬러를 그라디언트로(fixed로 하면 끊어진 컬러가 된다.)

Sample gradient - 시간을 넣을수 있다.(이외에 다른것도..)

Ambient - 하늘, 적도, 바닥 컬러를 정해준다. 라이트맵(환경광)의 컬러를 가져오는걸 알수있다.

Baked GI - 베이킹된 맵을 텍스쳐로 사용할수있다.(diffuse로 사용할수 있다는 뜻인데, 용도는 모르겠음.)

 

Refraction Probe - 반사 효과를 넣을수 있다.

'Unity > Shader Graph & Amplify' 카테고리의 다른 글

툰 쉐이더 Amplify shader set  (0) 2020.11.02
Shader graph-input03  (0) 2020.07.12
Shader graph -input01  (0) 2020.06.11
Shader graph -channel01  (0) 2020.06.10
Shader graph -Artistic03  (0) 2020.06.10

Boolean- 참, 거짓...(스위치이다.)

Color- 뭔말이 필요한가...

 

상수라고함.(어디에 쓰임있는지 아직모름..)

PI- 파이임..(3.1415926)

TAU- 파이에 2를 곱한 값.(6.28318530)

PHI- 황금비율(1.618034)

E- 지속적으로 무한으로 다가가는 (고라니TV 참고)
SQRT- 2의 제곱근 . 루트2

 

Integer -정수

Slider - float값을 기반으로 하는 최소최대치를 만든다.

Time-

Time- 1초마다 증가

SineTime- 싸인 그래프로 증가(1.6초면 1이 되고, 3.14초면 0이되고... -1)

CosineTime - 코싸인 그래프로 증가(1.6초면 0되고, 3.14초면 1이되고....-1)

DeltaTime - 프레임간에 시간차이를 매번 다르기 때문에 이를 보완하여 일정하게 만드는것.

SmoothDelta - 델타타임을 좀더 부드러운 간격으로 만든것.

 

Vector(float, uv, vertex...)

vector를 통하여 빼거나 더할수도 있다.

 

Bitangent Vector

출처: http://rapapa.net/?p=2419

object 좌표계:  각 오브젝트의 local로 본 좌표계

world 좌표계: 월드를 중심으로 본 좌표계

view 좌표계: 카메라의 로컬에서 x,y는 그대로이나 z가 반대인 좌표계

tangent 좌표계: 탄젠트벡터(U=x), 비탄젠트(V=y), 노멀벡터(z) 오브젝트이 각 정점마다 탄젠트 좌표계가 존재.

 

Positon

 

Screen Position

(잘안되서 헤멤: UniversalRenderPipelineAsset에 OpaqueTexture가 체크되어야 하며, 가능하면 DepthTexture까지 둘다 체크하고 개발.)

 

Tangent vector

어디에 쓰임있는지 모르겠음..

 

 

UV

 

고라니TV  외에 여러 사이트에서 참고하였습니다.

'Unity > Shader Graph & Amplify' 카테고리의 다른 글

Shader graph-input03  (0) 2020.07.12
Shader graph-input02  (0) 2020.06.29
Shader graph -channel01  (0) 2020.06.10
Shader graph -Artistic03  (0) 2020.06.10
Shader graph -Matcap  (0) 2020.05.30