반응형

2D 씬에 3D 오브젝트를 표현해 보자.

 

2D 씬에 스프라이트를 생성하고 Texture는 ViewportTexture를 지정한다.

 

SubViewport를 생성한다.

 

3D 씬에 Torus, Camera, Light를 생성하고 적당히 배치해 저장한다.

 

저장한 3D 씬을 SubViewport 자식 노드로 추가한다.

 

스프라이트 Texture - Viewport Path에 SubviewPort를 지정한다.

 

위와 같이 3D 카메라에 보이는 화면이 텍스쳐로 표현된다.

 

Transparent BG 옵션을 선택하면 배경이 투명해진다.

 

3D 오브젝트에 스크립트를 추가해 움직임을 적용하면 스프라이트에 반영된다.

 

반응형
Posted by J-sean
:
반응형

스크립트 작성 시 SerializeField와 Range 어트리뷰트를 함께 사용할 수 있다.

 

스크립트를 작성한다. 두 가지 방법으로 작성 할 수 있다.

 

a, b 멤버 변수를 Range에 정해진 범위 내에서 조절 가능하다.

 

반응형
Posted by J-sean
:
반응형

애니메이션 커브를 사용해 보자.

 

Sphere와 Cube 2개(A지점, B지점)를 생성한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Curve : MonoBehaviour
{
    public Transform targetA;
    public Transform targetB;
 
    public AnimationCurve lerpCurve;
 
    public Vector3 lerpOffset;
    public float lerpTime = 3.0f;
    private float timer = 0.0f;
 
    // Update is called once per frame
    void Update()
    {
        timer += Time.deltaTime;
        if (timer > lerpTime)
        {
            timer = lerpTime;
        }
 
        float lerpRatio = timer / lerpTime;
        Vector3 positionOffset = lerpCurve.Evaluate(lerpRatio) * lerpOffset;
 
        transform.position = Vector3.Lerp(targetA.position, targetB.position, lerpRatio) + positionOffset;
    }
}
 

 

스크립트를 작성한다.

 

작성한 스크립트를 Sphere에 추가한다.

 

TargetA, TargetB를 지정하고 Lerp Curve, Lerp Offset을 수정한다.

 

Lerp Curve는 위와 같이 수정한다.

 

플레이하면 Sphere가 부드럽게 이동한다.

 

반응형
Posted by J-sean
:
반응형

유도 미사일을 만들어 보자.

 

Square(Target)와 Capsule(Missile) 스프라이트를 생성한다.

 

Missile에 Rigidbody2D(Gravity Scale = 0)와 스크립트를 추가한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
[RequireComponent(typeof(Rigidbody2D))]
public class Guide : MonoBehaviour
{
    public Transform target;
    private Rigidbody2D rb;
 
    public float speed = 5.0f;
    public float rotateSpeed = 200.0f;
 
    // Start is called before the first frame update
    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
    }
 
    private void FixedUpdate()
    {
        Vector2 direction = (Vector2)target.position - rb.position;
        direction.Normalize();
 
        float rotateAmount = Vector3.Cross(direction, transform.up).z;
        rb.angularVelocity = -rotateAmount * rotateSpeed;
 
        rb.velocity = transform.up * speed;
    }
}
 

 

스크립트를 작성한다.

 

스크립트 Target 변수에 Target 오브젝트(Square)를 선택한다.

 

 

플레이 하면 미사일이 목표를 향해 날아간다.

 

반응형
Posted by J-sean
:
반응형

특정 조건에서 카메라를 흔들어 보자.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class CameraShake : MonoBehaviour
{
    public float shakeTime = 1.0f;
    public float shakeSpeed = 2.0f;
    public float shakeAmount = 1.0f;
 
    private Transform cam;
 
    // Start is called before the first frame update
    void Start()
    {
        cam = GameObject.FindGameObjectWithTag("MainCamera").transform;
    }
 
    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.S))
        {
            StartCoroutine(Shake());
        }
    }
 
    IEnumerator Shake()
    {
        Vector3 originPosition = cam.localPosition;
        float elapsedTime = 0.0f;
 
        while (elapsedTime < shakeTime)
        {
            Vector3 randomPoint = originPosition + Random.insideUnitSphere * shakeAmount;
            cam.localPosition = Vector3.Lerp(cam.localPosition, randomPoint, Time.deltaTime * shakeSpeed);
 
            yield return null;
 
            elapsedTime += Time.deltaTime;
        }
 
        cam.localPosition = originPosition;
    }
}
 

 

'S'키를 누르면 카메라가 진동한다.

 

스크립트를 Cube 오브젝트에 추가하고 'S'키를 누르면 카메라가 진동한다.

 

반응형
Posted by J-sean
:
반응형

유니티 NavMesh Components는 아직 정식버전이 없다. 아래와 같이 설치하자.

 

Window - Package Manager를 실행한다.

 

+ 버튼을 클릭하고 Add package from git URL...을 선택한다.

 

com.unity.ai.navigation을 입력하고 Add 버튼을 클릭한다.

 

설치가 완료되면 Preview가 표시된다.

 

 

Packages에 AI Navigation이 포함되어 있다.

※ 참고

Navigation and Pathfinding

 

반응형
Posted by J-sean
:
반응형

에러나 예외 발생 기록을 남겨보자.

Application.RegisterLogCallback()는 deprecated 되었으므로 Application.logMessageReceived를 사용한다.

 

Cube를 하나 생성하고 스크립트(Move)를 추가한다.

 

Move 스크립트는 ESC키를 눌렀을때 Divide By Zero 예외가 발생한다.

 

메인 카메라에 Logger 스크립트를 추가한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Logger : MonoBehaviour
{
    private System.IO.StreamWriter sw;
    public string logFileName = "log.txt";
 
    // Start is called before the first frame update
    void Start()
    {
        sw = new System.IO.StreamWriter(Application.persistentDataPath + "/" + logFileName);
        Debug.Log(Application.persistentDataPath + "/" + logFileName);
    }
 
    private void OnEnable()
    {
        Application.logMessageReceived += HandleLog;
    }
 
    private void OnDisable()
    {
        Application.logMessageReceived -= HandleLog;
    }
 
    void HandleLog(string logString, string stackTrace, LogType type)
    {
        sw.WriteLine("Logged at: " + System.DateTime.Now.ToString() + "\n"
            + "Log type: " + type + "\n"
            + "Log desc: " + logString + "\n"
            + "Trace: " + stackTrace
            );
    }
 
    private void OnDestroy()
    {
        sw.Close();
    }
}
 

 

위 내용을 Logger 스크립트에 작성한다.

 

 

실행하고 ESC키를 누른다. Console 창에 로그와 예외가 표시된다.

 

지정된 디렉토리에 로그 파일이 생성된다.

 

발생한 로그와 예외가 기록되어 있다.

 

반응형
Posted by J-sean
:
반응형

2022.01.18 - [Unity] - Unity3D - 유니티3D with AdMob 광고

Unity3D 앱에 배너 광고를 넣어 보자.

 

Empty 오브젝트를 만들고 스크립트를 추가한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#define UNITY_ANDROID
 
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
using System;
using GoogleMobileAds.Api;
 
public class NewBehaviourScript : MonoBehaviour
{
    private BannerView bannerView;
 
    // Start is called before the first frame update
    void Start()
    {
        // Initialize the Google Mobile Ads SDK.
        // Before loading ads, have your app initialize the Google Mobile Ads SDK
        // by calling MobileAds.initialize() which initializes the SDK and calls back
        // a completion listener once initialization is complete (or after a 30-second
        // timeout). This needs to be done only once, ideally at app launch.
        MobileAds.Initialize(initStatus =>
        {
            Dictionary<string, AdapterStatus> map = initStatus.getAdapterStatusMap();
            foreach (KeyValuePair<string, AdapterStatus> keyValuePair in map)
            {
                string className = keyValuePair.Key;
                AdapterStatus adapterStatus = keyValuePair.Value;
                switch (adapterStatus.InitializationState)
                {
                    case AdapterState.Ready:
                        // The adapter initialization ready.
                        MonoBehaviour.print($"Adapter: {className} is {adapterStatus.Description}");
                        // Adapter: ExampleClass is Ready
                        break;
 
                    case AdapterState.NotReady:
                        // The adapter initialization not ready.
                        MonoBehaviour.print($"Adapter: {className} is {adapterStatus.Description}");
                        break;
 
                    default:
                        break;
                }
            }
        });
 
        this.RequestBanner();
    }
 
    private void RequestBanner()
    {
        #if UNITY_ANDROID
        string adUnitId = "ca-app-pub-3940256099942544/6300978111";
        #elif UNITY_IPHONE
            string adUnitId = "ca-app-pub-3940256099942544/2934735716";
        #else
            string adUnitId = "unexpected_platform";
        #endif
 
        // Create a 320x50 banner at the top of the screen.
        this.bannerView = new BannerView(adUnitId, AdSize.Banner, AdPosition.Top);
 
        // Called when an ad request has successfully loaded.
        this.bannerView.OnAdLoaded += this.HandleOnAdLoaded;
        // Called when an ad request failed to load.
        this.bannerView.OnAdFailedToLoad += this.HandleOnAdFailedToLoad;
        // Called when an ad is clicked.
        this.bannerView.OnAdOpening += this.HandleOnAdOpened;
        // Called when the user returned from the app after an ad click.
        this.bannerView.OnAdClosed += this.HandleOnAdClosed;
        // Removed OnAdLeavingApplication event for all formats.
        //this.bannerView.OnAdLeavingApplication += this.HandleOnAdLeavingApplication;
 
        // Create an empty ad request.
        AdRequest request = new AdRequest.Builder().Build();
 
        // Load the banner with the request.
        this.bannerView.LoadAd(request);
    }
 
    // Update is called once per frame
    void Update()
    {
 
    }
 
    public void HandleOnAdLoaded(object sender, EventArgs args)
    {
        MonoBehaviour.print("HandleAdLoaded event received");
    }
 
    public void HandleOnAdFailedToLoad(object sender, AdFailedToLoadEventArgs args)
    {
        MonoBehaviour.print("HandleFailedToReceiveAd event received with message: "
            + args.ToString());
    }
 
    public void HandleOnAdOpened(object sender, EventArgs args)
    {
        MonoBehaviour.print("HandleAdOpened event received");
    }
 
    public void HandleOnAdClosed(object sender, EventArgs args)
    {
        MonoBehaviour.print("HandleAdClosed event received");
    }
 
    //public void HandleOnAdLeavingApplication(object sender, EventArgs args)
    //{
    //    MonoBehaviour.print("HandleAdLeavingApplication event received");
    //}
 
    private void OnDestroy()
    {
        this.bannerView.Destroy();
    }
}
 

 

스크립트 소스를 입력하고 저장한다.

 

게임을 실행하면 화면 상단에 배너가 표시된다.

 

반응형
Posted by J-sean
: