블러드라인

dasfsaafdsafsadfsad

카메라에 붙음

레이캐스트

using UnityEngine; 
using System.Collections; 
 
public class CharacterRay : MonoBehaviour { 
    //CharacterRay는 Camera에 붙어있음 
   
  // Update is called once per frame 
  void Update () { 
      if(Input.GetMouseButtonDown(0)) //클릭시 
        { 
            RaycastHit hit; 
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); 
            if (Physics.Raycast(ray, out hit)) 
            { 
                if (hit.transform.gameObject.tag == "Enemy") //맞은 오브젝트의 tag가 Enemy일경우 
                { 
                    hit.transform.gameObject.SendMessage("Dead"); 
                    //맞은 gameobject에서 Dead라는 메소드 실행, 인자값없음 
                } 
            } 
        } 
  } 
} 

 

각각 솔져에 붙음

코루틴

 

index는 반드시 Unity상에서 각각 솔져별로 숫자를 다르게 해 줄것, 숫자는 0부터 시작

using UnityEngine; 
using System.Collections; 
 
public class RayStandBy : MonoBehaviour { 
    //RayStandBy는 각각의 soldier들에게 붙어있고, 각 soldier들의 상태를 갖고있음 
 
    public int index = -1; //각각의 index는 여기서 수정하는 것이 아닌 Unity상에서 수정함!! 
    public GameObject explosion; // 
 
    void Start() 
    { 
        if(DisplaySoldier.controller.soldiers[index] == 0) //자신의 index의 값이 0일경우 (꺼진 상태) 
        { 
            gameObject.SetActive(false); //자신의 Active상태를 false로 바꿈(끔) 
        } 
    } 
 
    public void Dead() //CharacterRay에서 실행할 메소드 
    { 
        GetComponent<Animator>().SetBool("dead", true); //애니메이션 변경 
        StartCoroutine(DeadStandby()); //코루틴 실행 
 
    } 
 
    IEnumerator DeadStandby() 
    { 
        yield return new WaitForSeconds(2); //2초대기 
        Instantiate(explosion, transform.position, transform.rotation); //폭발! 
        DisplaySoldier.controller.changeState(index); //DisplaySoldier에서 changeState메소드 실행, 인자값은 각 soldier들의 index 
        Destroy(gameObject);//자기자신 삭제 
    } 
} 

 

바깥에 Empty Object에 붙임

모든 솔져들 컨트롤

using UnityEngine; 
using System.Collections; 
 
public class DisplaySoldier : MonoBehaviour { 
    //DisplaySoldier는 바깥에 EmptyObject에서 모든 soldier들의 Active상태를 관리하기 위해 사용 
 
 
    public static DisplaySoldier controller; 
    //외부에서 쉽게 접근할 수 있도록 controller를 static으로 선언 
     
    public int[] soldiers = { 1, 1, 1, 1 }; //각 솔져들의 기본 상태 
    // 0 : 보이지않음 
    // 1 : 보임 (SetActive(true)) 
 
    void Awake() //시작할때! 
    { 
        controller = this; 
        //자기자신을 등록 
 
        if(PlayerPrefs.GetString("soldiers") != "") //soldiers라는 PlayerPref가 존재할경우 (저장된경우) 
        { 
            string[] ary; //임시변수 
            ary = PlayerPrefs.GetString("soldiers").Split(','); // ','를 기준으로 잘라냄 
 
            for(int i = 0; i < soldiers.Length; i++) 
            { 
                soldiers[i] = System.Convert.ToInt32(ary[i]); //string형을 int형으로 형변환해줌 
            } 
        } 
    } 
    public void changeState(int index) //soldiers 어레이를 수정할 메소드 
    { 
        soldiers[index] = 0; // 0의 경우 SetActive를 False로 변환 
        string ary = ""; //PlayerPref를 string형으로 저장하기 위해 사용할 임시변수 
        for(int i = 0; i < soldiers.Length; i++) 
        { 
            if(i < soldiers.Length -1) 
            { 
                ary += soldiers[i].ToString() + ","; //하나 추가하고 뒤에 ','를 붙여줌 
            } 
            else 
            { 
                ary += soldiers[i].ToString(); // 마지막의 경우 ,를 붙일 이유가 없음 
            } 
        } 
        PlayerPrefs.SetString("soldiers", ary); 
        //solders라는 이름의 PlayerPref을 ary값으로 설정 
    } 
} 

C# 스크립트 true/false

using UnityEngine; 
using System.Collections; 
 
public class CarController : MonoBehaviour { 
 
    public GameObject car; 
    //public float moveSpeed = 0.1f; 
    public Vector3 v3; 
    private bool flagB = true; 
    private int flagI = -1; //원래는 1이 기본값이었지만... 
    //차량 회전이 반대로 되서!! 
 
    float f; 
 
  // Use this for initialization 
  void Start () { 
        f = Random.Range(0.0f, 1.0f); //초기랜덤값 
    } 
   
  // Update is called once per frame 
  void Update () { 
        if(Input.GetKeyDown("space")) 
        { 
            f = Random.Range(0.0f, 1.0f); //스페이스바를 누를 때 마다 랜덤값이 바뀜 
            flagB = !flagB; //true는 false로 false는 true로 
            if(flagB) 
            { 
                flagI = -1; //-1이거나 1이거나 
            } 
            else 
            { 
                flagI = 1; 
            } 
            car.transform.Rotate(0.0f, (180.0f * flagI), 0.0f); //차량로테이트 
        } 
        v3.x += f*flagI; //벡터의 x에서의 이동속도만큼 감소... 
        //X * -1 = -X 
        //X * 1 = X  
        car.transform.position = v3; 
         
    } 
} 

 

C# 상속 및 접근 제한자

ParentClass.cs

using UnityEngine; 
using System.Collections; 
 
public class ParentClass : MonoBehaviour { 
 
    public int pubVar; 
    private int priVar; 
    protected int proVar; 
 
    public void PubFunction() 
    { 
        print("I am public"); 
    } 
 
    private void PriFunction() 
    { 
        print("I am private"); 
    } 
 
    protected void ProFunction() 
    { 
        print("I am protected"); 
    } 
} 

ChildClass.cs

using UnityEngine; 
using System.Collections; 
 
public class ChildClass : ParentClass { 
 
    void Start() 
    { 
        PubFunction(); 
 
        PriFunction(); //오류 발생!!! 
 
        ProFunction(); 
    } 
 
}