using UnityEngine;

using UnityEngine.UI;

using System;

using System.Collections;



public class touchpad:MonoBehavior{



//_touchPad 오브젝트를 연결합니다.

private RectTransform _touchPad;



//터치 입력중에 방향 컨트롤러의 영역안에 있는 입력을 구분하기 위한 아이디어입니다.

private int_touchId=-1;



//입력이 시작되는 좌표입니다.

private Vector3_startPos =Vector3.zero;



//방향 컨트롤러가 원으로 움직이는 반지름입니다.

public float _dragRadius=60f;



//플레이어의 움직임을 관리하는 PlayerMovement 스크립트와 연결합니다.

//방향키가 변경되면 캐릭터에게 신호를 보내야 하기 때문입니다.

public PlayerMovement _player;

//버튼이 눌렸는지 체크하는 bool 변수입니다.

private bool _buttonPressed=false;



void Start(){

// 터치패드의 RectTransform 오브젝트를 가져옵니다.

_touchPad =GetComponent<RectTransform>();



//터치패드의 좌표를 가져옵니다. 움직임의 기준값이 됩니다.

_startPos=_touchPad.position;

}



public void ButtonDown(){

//버튼이 눌렸는지 확인해 놓습니다.

_buttonPressed =true;

}



public void ButtonUp(){

_buttonPressed=false;

//버튼이 떼어졌을 때 터치패드와 좌표를 원래 지점으로 복귀시킵니다.

HandleInput(_startPos);

}



void FixedUpdate()

{

//모바일에서는 터치패드 형식으로 여러 터치 입력을 받아 처리합니다.

HandleTouchInput();
//모바일이 아닌 Pc나 유니티 에디터 상에서 작동할 때는 터치입력이 아닌 마우스로 입력 받습니다.
#if Unity_EDITOR || UNITY_STANDALONE_OSX||UNITY_STANDALONE_WIN || UNITY_WEBPLAYER

HandleInput(Input.mousePosition);

#endif
}

void HandleTouchInput()
{
//터치 아이디 (touchId)를 매기기 위한 번호입니다.
int i =0;
//터치 입력은 한 번에 여러 개가 들어올 수 있습니다. 터치가 하나 이상 입력되면 실행되도록 합니다.
if(Input.touchCount>0){
//각각의 터치 입력을 하나씩 조회합니다.
foreach(Touch touch in Input.touches){
i++;
//현재 터치 입력의 x,y좌표를 구합니다.
Vector3 touchPos = new Vector3(touch.position.x , touch.position.y);
//터치 입력이 방금 시작되었다면, 혹은 TouchPhase이면 ,
if(touch.phase == TouchPhase.Began){
//그리고 터치의 좌표가 현재 방향키 범위 내에 있다면
if(touch.position.x<=(_startPos.x + _dragRadius)){
//이 터치 아이디를 기준으로 방향 컨트롤러를 조작하도록 합니다.
_touchId=i;

}
}
//터치 입력이 움직였다거나, 가만히 있는 상황이라면
if(touch.phase == Touchphase.Moved|| touch.phase==TouchPhase.Stationary)
{
//터치 아이디로 지정된 경우에만
if(_touchId==i){
//좌표입력을 받아들입니다.
HandleInput
(touchPos);
}
}
//터치 입력이 끝났는데.
if(touch.phase == TouchPhase.Ended)
{
//입력받고자 했던 터치 아이디라면
if(_touchId==i){
//터치 아이디를 해제합니다
_touchId=-1;

}
}
}

}

void HandleInput( Vector3 input){
//버튼이 눌러진 상황이라면
if(_buttonPressed){

//방향 컨트롤러의 기준 좌표로부터 입력받은 좌표가 얼마나 떨어져 있는지 구합니다.
Vector3 diffVector = (input -_startPos);

//입력 지점과 기준 좌표의 거리를 비교합니다. 만약 최대치 보다 크다면
if(diffVector.sqrMagnitude> _dragRadius * _dragRadius)
{
//방향 벡터의 거리를 1로 만듭니다.
diffVector.Normalize();

//그리고 방향 컨트롤러는 최대치만큼만 움직이게 합니다.
_touchPad.position = _startPos+diffVector*_dragRadius;

//현재 입력 좌표에 방향키를 이동시킵니다.
}
else//입력 지점과 기준 좌표가 최대치보다 크지 않다면
{
//현재 입력 좌표에 방향키를 이동시킵니다.
_touchPad.position=Input;
}
}
else
{
//버튼에서 손이 떼어지면 , 방향키를 원래 위치로 되돌려 놓습니다.

_touchPad.position=_startPos;
}
}
//방향키와 기준 지점의 차이를 구합니다.
Vector3 diff = _touchPad.position =_startPos;

//방향키의 방향을 유지한 채로 거리를 나누어 방향만 구합니다.
Vector2 normDiff = new Vector3(diff.x/_dragRadius,diff.y/_dragRadius);

if(_player != null){
//플레이어가 연결되어 있으면 ,플레이어에게 변경된 좌표를 전달해줍니다.
_player.OnStickChanged(normDiff);
}

}
}




using 이걸 쓰겠다

system 시스템이라는 보따리에

generic 및 여러 라이브러리? 가있다


c#은 시작시에 main(){}함수를 끼고 시작한다


console 이라는 도화지에 console.readkey, console.writeline 은

각각 console.writeline("hello csharp") 을 쓰겠다는 것이고 run 하면 삭제된다

console.readkey()키를 읽어오겠다는 것이고 다음줄에서 깜빡깜빡 키입력을 기다리는것이다.

int a= 3;

a가 정수일경우

string b;

b= a.ToString();을 실행하면 

정수였던 a 가 ToString()으로 읽혀서 문자열로 출력된다.


maint( string [] arg){

//일경우


console.writeline("hello csharp"+ b);

//출력시 hello csharpb


}


콘솔창에 hellocsharp 클래스 경로 수정후 

hellocsharp 과 test test

라고 입력하면

2가 출력되는데 이유는 string 값에 2개가 입력되기 때문이다.


위에는 비주얼스튜디오에서 console.form 으로 만들었을때 프로젝트도


winform프로젝트는 fomr 을 주고 레이블을 삽입후

레이블 밸류값을 수정 가능하고

클릭 이벤트 및 객체에 마우스를 올릴때 손모양이 바뀌는 기능을 제공하며


함수에는 여러 이벤트를 컨트롤하는 이벤트 핸들러가 있고 대부분 ide에서 제공한다. 



using UnityEngine;

using System;

using SystemCollections;


//클래스 선언 위에 RequireComponent(typeof(Animator))라는 구문은

//이 게임 오브젝트에 Animator가 없으면 안된다고 명시하는 역활을 합니다.

//이 스크립트가 붙어 있는 게임 오브젝트에 Animaotr 컴포넌트가 없으면 게임이 실행되지 않는다


[RequireComponent(typeof(Animator))]

public class PlayerMovement:MonoBehaviour{


//이 게임 오브젝트에 붙어있는 Animator 컴포넌트를 가져온다

protected Animator avatar;


float lastAttackTime,lastSkillTime,lastDashTime;

public bool attacking=false;

public bool dashing=false;

void Start(){

avatar=GetComponent<Animator>();

}


//h:Horizontal 방향 컨트롤ㄹ러의 가로방향

//v:Vertucal 방향 컨트롤러의 세로뱡항입니다.

float h,v;


//방향 컨트롤러에서 컨트롤러에 변경이 일어나면 호출되는 ㅎ마수입니다.

public void OnStickChanged(Vector2 stickPos)

{

h= stickPos.x;

v=stickPos.y;

{

//매 프레임마다 터치 컨트롤러에서 오는 신호를 애니메이터에 전달합니다.

voidupdate(){

//아바타(애니메이터)가 있어야만 제대로 실행됩니다.

if(avatar){

float back=1f;

if(v<0f)back=-1f;

//애니 메이터에 전달하는 값은 속도 뿐입니다.

avatar.SetFloat("Speed",(h*h+v*v));


Rigidbody rigidbody =GetComponent<Rigidbody>();


if(rigidbody){


Vector3 speed=rigidbody.velocity;

speed.x=4*h;

speed.z=4*v;

rigidbody.velocity=speed;

if(h!=0f && v!=0f){

//캐릭터의 방향 전환은 즉시 이루어지며,

//애니메이터에 전달되지 않고 자체적으로 해결합니다.

transform.rotation=Quaternion.LookRotation(new Vector3(h,0f,v));

}

}

}}


public void OnAttackDown(){

attacking =true;

avatar.SetBool("Combo",true);

StartCoroutine(StartAttack());

}


public void OnAttackUp(){

avatar.SetBool("Combo",false);

attacking=false;

}


IEnumerator StartAttack(){

if(TIme.time-lastAttackTime>1f){

lastAttackTime= TIme.time;

while(attacking){

avatar.SetTrigger("AttackStart");

yield return new WaitForSeconds(1f);

}

}}


public void OnSkillDown(){

if(Time.time-lastSkillTime>1f){

avatar.SetBool("Skill,true");

lastSkillTime=Time.time;

}

}


public void OnSkillUp()

{

avatar.SetBool("Skill",false);

}


public void OnSkillDown()

{

if(Time.time-lastSkillTime>1f)

{

avatar.SetBool("Skill".true);

lastSkillTime=TIme.time;

}

}


public void OnSkillUp()

{

avatar.SetBool("Skill".true);

lastSkillTime=Time.time;

}


public void OnDashDown()

{

if(Time.time-lastDashTime>1f){

lastDashTime=Time.time;

dashing=true;

avatar.SetTrigger("Dash");

}


public void OnDashUp()

{    

dashing=false;

}{

}

//클래스 선언 위에 RequireComponent(typeof(Animator))라는 구문은

//이게임 오브젝트에 Animator가 없으면 안된다고 명시하는 역활을 합니다.

// 이스크립트가 붙어있는 게임오브젝트에 Animator컴포넌트가 없으면 게임이 실행되지않습니다.






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

C# 해외 면접시 TOP50  (0) 2018.12.10
주인공을 따라다니는 카메라 만들기 following camera  (0) 2018.12.10
TouchPad.cs  (0) 2018.12.10
예제로 배우는 C#  (0) 2018.12.07
게임 개발 전체 프로세스  (0) 2018.12.07

유니티 3d엔진을 공부하는 이유


게임업계에서 지배적인 점유율을 가지고 있다

게임 스타트업을 위해 가장 현실적인 게임엔진

게임업계에 취직할 때 스킬 세트로 큰도움이 된다



게임회사의 입장

게임회사는 유니티 엔진을 다룰수있느개발자를 필요로할까요?

정해진 예산 안에서 게임을 잘 만들어서 돈을 벌기위해서



-훌륭한 기계공은 일반 기계공보다 몇 배의 급여를 더 높이 받는다 그러나 훌륭한 코드를 만들어내는 개발자는 일반적인 개발자보다 1만배 이상의 가치가있다-

-빌게이츠-

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

C# 해외 면접시 TOP50  (0) 2018.12.10
주인공을 따라다니는 카메라 만들기 following camera  (0) 2018.12.10
TouchPad.cs  (0) 2018.12.10
예제로 배우는 C#  (0) 2018.12.07
unity player movement.cs 플레이어 움직임 /유니티  (0) 2018.12.07

+ Recent posts