Rigidbody.velocity는 월드 좌표로만 수정가능한데.

만약 상대적인 방향으로 움직이려면


velocity를 로컬좌표로 변환하고 수정한후 월드좌표로 다시 바꿔서 넣으면 된다.



1
2
3
4
Vector3 locVel = transform.InverseTransformDirection(rig.velocity);
locVel.x = x;
locVel.z = z;
rig.velocity = transform.TransformDirection(locVel);
cs



출처 : http://answers.unity3d.com/questions/193398/velocity-relative-to-local.html

블로그 이미지

stuban

ㅇ.ㅇ

,

친구가 만들었다고 하길래 나도 만들어본 사운드 매니저.


효과음이나 배경음악을 파일이름으로 재생할 수 있다.

심지어 배경음악 바꿀때 천천히 바꿀 수 도 있음 ㅎ


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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class SoundManager : MonoBehaviour {
 
    //싱글톤
    private static SoundManager instance;
    public static SoundManager GetInstance()
    {
        if (!instance)
        {
            instance = GameObject.FindObjectOfType(typeof(SoundManager)) as SoundManager;
            if (!instance)
                Debug.Log("오류");
        }
 
        return instance;
    }
 
 
    public int audioSourceCount = 3;//최대 오디오 소스 개수
 
    [SerializeField]
    [Header("clips"), Tooltip("오디오 클립들")]
    public AudioClip[] BGMs = new AudioClip[2];
    public AudioClip[] SFXs = new AudioClip[3];
 
 
    private AudioSource BGMsource;
    private AudioSource[] SFXsource;
 
    private void OnEnable ()
    {
        BGMsource = gameObject.AddComponent<AudioSource>();
        BGMsource.playOnAwake = false;
        BGMsource.loop = true;
 
        //sfx 소스 초기화
        SFXsource = new AudioSource[audioSourceCount];
 
        for(int i=0;i< SFXsource.Length; i++)
        {
            SFXsource[i] = gameObject.AddComponent<AudioSource>();
            SFXsource[i].playOnAwake = false;
        }
    }
    
    /**********SFX***********/
 
    public void PlaySFX(string name)//효과음 재생
    {
        for(int i=0;i<SFXs.Length;i++)
        {
            if(SFXs[i].name == name)
            {
                GetEmptySource().clip = SFXs[i];
                GetEmptySource().Play();
                return;
            }
        }
    }
 
    private AudioSource GetEmptySource()//비어있는 오디오 소스 반환
    {
        int lageindex = 0;
        float lageProgress = 0;
        for (int i = 0; i < SFXsource.Length; i++)
        {
            if (!SFXsource[i].isPlaying)
            {
                return SFXsource[i];
            }
 
            //만약 비어있는 오디오 소스를 못찿으면 가장 진행도가 높은 오디오 소스 반환
 
            float progress = SFXsource[i].time / SFXsource[i].clip.length;
            if(progress > lageProgress)
            {
                lageindex = i;
                lageProgress = progress;
            }
        }
        return SFXsource[lageindex];
    }
 
    /**********BGM***********/
 
    private AudioClip changeClip;//바뀌는 클립
    private bool isChanging =false;
    private float startTime;
 
 
    [SerializeField]
    [Header("Changing speed"), Tooltip("브금 바꾸는 속도")]
    public float ChangingSpeed;
 
    public void ChangeBGM(string name, bool isSmooth)//브금 변경 (브금이름 , 부드럽게 바꾸기)
    {
        changeClip = null;
        for (int i = 0; i < BGMs.Length; i++)//브금 클립 탐색
        {
            if (BGMs[i].name == name)
            {
                changeClip = BGMs[i];
            }
        }
 
        if (changeClip == null)//없으면 탈주
            return;
 
        if (isSmooth)//스무스 하게 체인지 ~
        {
            startTime = Time.time;
            isChanging = true;
        }
        else
        {
            BGMsource.clip = changeClip;
            BGMsource.Play();
        }
    }
 
    private void Update()
    {
        if (!isChanging) return;
 
        float progress = (Time.time - startTime) * ChangingSpeed;//부드러운 오디오 전환
        BGMsource.volume = Mathf.Lerp(10, progress);
 
        if(progress > 1)
        {
            isChanging = false;
            BGMsource.clip = changeClip;
            BGMsource.Play();
 
            Debug.Log("BGM CHANGE DONE!");
        }
    }
 
}
cs



사실 브금 부분은 아직 제대로 테스트 안해봤음


+ 이 소스 쓰지 마세요 ㅎㅎ

실제로 써보니깐 여러가지 문제가 있었습니다.

문제점들 수정하면 쓸만한데

쓸만하게 만들 자신 있으면 차라리 자기거 만드는게 이득입니다 ㅎ

블로그 이미지

stuban

ㅇ.ㅇ

,

SQL에서  주석은  '--' 을 써서 씀


SQL에서 대소문자 구분따위는 없음


1
CREATE DATEBASE 이름; --데이터베이스 만들기
cs


1
use Test; -- Test데이터 베이스 사용      
cs


1
2
3
4
5
6
7
--테이블 만들기
CREATE TABLE testTable (
 
Code INT--코드 int형
Title NVARCHAR(50), --타이틀 string NVARCHAR = 유니코드를 사용하는 문자
Price INT -- 가격 int
);                         
cs


1
2
3
4
5
INSERT INTO 테이블이름(Code,Title,Price) --집어넣을 테이블 이름과 자료형 명시
VALUES (123,'스트링',500);--집어넣을 자료
 
INSERT INTO 테이블이름 --열의 개수만큼 자료를 넣는다면 자료형 명시 스킵 
VALUES (123,'스트링',500);--집어넣을 자료
cs



1
2
SELECT * FROM 테이블이름; --모든 테이블 정보 보기
SELECT 원하는항목,원하는항목2 FROM 테이블이름; --원하는 열의 정보만 보기
cs



1
2
3
--테이블 수정()
ALTER TABLE 테이블이름
ADD 추가할데이터이름 데이터형 초기값;
cs


1
2
3
--테이블 수정(행제거)
ALTER TABLE 테이블이름
DROP COLUMN 행이름
cs


1
2
3
4
5
6
7
--오름차순 정렬
SELECT * FROM 테이블이름 ORDER BY 행이름 ASC;
--이것도 오름차순 
SELECT * FROM 테이블이름 ORDER BY 행이름;
 
--내림차순 정렬
SELECT * FROM 테이블이름 ORDER BY 행이름 DESC;
cs




1
DELETE 테이블이름; --테이블 삭제
cs


'프로그래밍 > SQL' 카테고리의 다른 글

오늘 새로배운 mysql 정리  (0) 2017.10.12
sql 메모  (0) 2017.10.11
apmSetup  (0) 2017.10.11
SQL 정리 - 2 자료형들  (0) 2017.05.20
sql 정리  (0) 2017.05.17
블로그 이미지

stuban

ㅇ.ㅇ

,

sql 정리

프로그래밍/SQL 2017. 5. 17. 23:33

사실 그냥 하나씩 정리해서 마치 강의식으로 사진도 넣고 하면서 포스트를 쓸려고 했는데 블로그를 옮기니깐 너무 귀찮고 해서 그냥 글로만 쓸게요.



http://stuban.blog.me/220970484549 //처음에 올리던 SQL글

'프로그래밍 > SQL' 카테고리의 다른 글

오늘 새로배운 mysql 정리  (0) 2017.10.12
sql 메모  (0) 2017.10.11
apmSetup  (0) 2017.10.11
SQL 정리 - 2 자료형들  (0) 2017.05.20
SQL 정리 - 1 테이블 생성과 수정  (0) 2017.05.17
블로그 이미지

stuban

ㅇ.ㅇ

,

최근 유니티로 안드로이드 빌드를 하려면 이런 오류메시지가 뜬다


내 빈약한 영어 실력으로 대충 해석해 보자면 안드로이드 sdk경로가 맞지않다는 뜻인데.


분명히 모든 경로가 완벽한걸 확인해도 저 메시지는 계속 뜨게 된다.

물론 디버그 창에도 오류가 뜨게 된다


(디버그 창에 나오는 오류메시지)

Error building Player: CommandInvokationFailure: Unable to list target platforms. Please make sure the android sdk path is correct. See the Console for more details. 


저 위의 메시지로 구글링을 해본결과


sdk를 다운받을 수 있는 안드로이드 스튜디오가 업뎃 되면서

유니티가 쓰던 기능이 바뀌었다고 한다....


해결 방법은 아래 링크에서 안드로이드 스튜디오를 다운그레이드 하고 sdk를 다시 다운 받는 방법이 있으나...

https://developer.android.com/studio/archive.html


다행히도 저 해결법을 알려준 글에서 친절하게도 예전버전의 바뀐 부분만 올려 주셨다!

http://dl-ssl.google.com/android/repository/tools_r25.2.5-windows.zip


sdk의 tools폴더를 지우거나 이름을 바꿔놓고 다운받은 파일을 tools 로바꾸면 정상적으로 빌드 할 수 있게 된다.


출처 : http://www.devkorea.co.kr/bbs/board.php?bo_table=m03_qna&wr_id=79671


네이버 원글 : http://stuban.blog.me/220995514977

블로그 이미지

stuban

ㅇ.ㅇ

,

유튜브에서 뭔가 신나는 노래만 나오는 영상에 자주 나오는 움직이는 정신사나운 막대.

그 막대기들을 유니티로 만들어 보자

--동영상 예시(화질구지)--



아래는 소스코드


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
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
 
public class Visualizer : MonoBehaviour {
 
    public GameObject bar;//막대 원본
 
    public Transform barsParent;//막대 부모
 
    private RectTransform[] bars = new RectTransform[64];//막대들
 
    private AudioSource audioSur;//오디오 소스
 
    public float[] samples = new float[64]; //샘플//샘플수는 64가 최소 2의 거듭제곱으로 해야함
        
    private void OnEnable()
    {
        for(int i=0;i<bars.Length;i++)//막대들 만들기
        {
            bars[i] = (Instantiate(bar) as GameObject).GetComponent<RectTransform>();//막대생성
            bars[i].parent = barsParent;//부모설정
            bars[i].localPosition = new Vector2(i * 100);//포지션설정
 
            //색깔 랜덤
            bars[i].GetComponent<Image>().color = 
                new Vector4(Random.Range(0.0f, 1.0f), Random.Range(0.0f, 1.0f), Random.Range(0.0f, 1.0f), 1);
 
            bars[i].sizeDelta = new Vector2(51);//사이즈 초기화
        }
 
        audioSur = GetComponent<AudioSource>();//오디오 소스 가지고오기
 
        audioSur.Play();//플레이
    }
 
    private void Update()
    {
        //스펙트럼 가지고오는 함수
        audioSur.GetSpectrumData(samples, 0, FFTWindow.Rectangular);
    
        for(int i=0;i< 64; i++)//크기 조절
        {
            bars[i].sizeDelta = new Vector2(5, samples[i] * 700);
        }
    }
}


cs





오디오 스펙트럼의 막대는 이렇게 구성되어있다.

RectTransform의 Height를 조정하여 크기를 조절한다.

그냥 흰색으로만 되어있으면 심심하기 때문에 막대를 만들때 색깔을 랜덤으로 하였다.



하이라키 구성은 이렇게 되어있다.

하이라키의 GameObject에 위에 있는 소스와 오디오 소스가 들어있다.

당연히 GameObject의 오디오소스에는 세계적인 뮤지션 samsung의 대표곡 Over The Horizon을 넣어두었다.

막대를 만들때 부모를 캔버스의 Bars로 설정해두었다.


위에있는 소스코드의 메인인 스펙트럼을 가지고 오는 함수는 AudioSource.GetSpectrumdata이다


첫번째 인자는 샘플들을 저장할 수 있는 float배열을 받는데 배열의 길이는 무조건 64이상의 2의 승수다.


두번째 인자는 채널(뭔지는 모르겠다)


세번째 인자는 FFTWindow형이다

FFT는 고속 푸리에 변환(Fast Fourier Transform)의 약자이며 주파수를 사인파의 집합으로 분해 하는 알고리즘이라고 한다.

그리고 FFTWindow는 스펙트럼 분석 창 유형을 정하는 데 쓰인다.


참고로 푸리에 변환 알고리즘은 위같은 스펙트럼을 분석하는데 쓰거나 mp3파일을 만들때 심지어 MRI에도 쓰인다고 한다





고속 푸리에 변환에 대한 위키백과 링크

https://ko.wikipedia.org/wiki/%EA%B3%A0%EC%86%8D_%ED%91%B8%EB%A6%AC%EC%97%90_%EB%B3%80%ED%99%98


그 푸리에 변환을 만든 사람에 대한 위키백과 링크

https://ko.wikipedia.org/wiki/%EC%A1%B0%EC%A0%9C%ED%94%84_%ED%91%B8%EB%A6%AC%EC%97%90


FFTWindow에 대한 유니티 도큐먼트

https://docs.unity3d.com/ScriptReference/FFTWindow.html


AudioSource.GetSpectrumdata에 대한 유니티 도큐먼트

https://docs.unity3d.com/ScriptReference/AudioSource.GetSpectrumData.html


이글의 원본인 내 옛날 네이버 블로그

http://stuban.blog.me/220984744908


블로그 이미지

stuban

ㅇ.ㅇ

,