private GameObject enemyTarget; //적 타겟 // Use this for initialization void Start() { //내직속자식중 Head 의 이름을 가진 게임오브젝트의 Transform 을 찾아온다 없으면 NULL 리턴 this.headTransform = this.transform.FindChild("Head"); //주의 할건 나의 직속 자식만 가져온다. 예를 들어 건을 가지고 온다면 다음과 같이 써야 한다. //this.transform.FindChild("Head").FindChild("Gun"); //this.transform.FindChild("Head/Gun"); //내총 가가지고 온다. guns = this.GetComponentsInChildren <Gun>(); //만약 Target 이 설정 되어있지 않다면.... if (this.enemyTarget == null) { //적을 찾는다. //씬에 배치된 게임오브젝트 중에 "PlayerPlane" 이름의 게임오브젝틀 찾고 //없다면 Null 이 리턴된다. //여러게 있다면 그중하나다..... ( 무거우니 사용을 지양하자... ) //this.enemyTarget = GameObject.Find("PlayerPlane"); //Tag 로 적을 찾는다. this.enemyTarget = GameObject.FindGameObjectWithTag("PlayerPlane"); //찾은 적을 Head 에 LookTargetTarget 에 타겟으로 전달 //LookTargetTransform lookTraget = this.GetComponentInChildren<LookTargetTransform>(); //해당 Transform 으로도 GetComponent 컴포넌트를 사용할수 있다. //이렇게 되면 해당 Transform 이물린 게임오브젝트의 컴포넌트를 가지고 오게 된다. LookTargetTransform lookTraget = this.headTransform.GetComponent <LookTargetTransform>(); if (lookTraget != null) { lookTraget.target = this.enemyTarget; } } }
//발사 함수 public void Fire() { //발사 준비가 안되었다면 발사안된다. if (IsReadyShot == false) { return; } this.IsReadyShot = false; //for (int i = 0; i < 12; i++) //{ //명중 오차각에 의한 발사 회전 사원수 계산 //0 ~ 360 도의 랜덤 라디안 각 float angleRad = Random.Range(0.0f, 360.0f) * Mathf.Deg2Rad; Vector3 randVector = new Vector3( Mathf.Cos(angleRad), Mathf.Sin(angleRad), 0.0f); //위의 랜덤 각에 의한 축회전 사원수를 구한다. Quaternion rotError = Quaternion.AngleAxis( Random.Range(0.0f, this.errorAngle), randVector); //특정 게임오브젝트의 클론을 만들어 씬에 배치 하고 //새롭게 배치된 클론의 뷸렛을 newBullet 이 참조한다. GameObject newBullet = Instantiate( this.srcBuller, //원본 게임오브젝트 ( 보통은 프리펩을 참조시킨다 ) this.transform.position, //배치될 씬의 월드 위치 ( 내위치로 배치한다 ) this.transform.rotation * rotError //배치될 씬의 회전 값사원수 (나의 회전위치와 동일하게 ) ) as GameObject; //새롭게 만들어진 뷸렛에 lookTarget 컴포넌트가 있니? LookTargetTransform lookTarget = newBullet.GetComponent <LookTargetTransform>(); if (lookTarget != null) { //에네미 캐논을 다 찾는다. GameObject[] targets = GameObject.FindGameObjectsWithTag("EnemyCannon"); //그중에 랜덤 int randIdx = Random.Range(0, targets.Length); //Random.Range(0, 4 ) => 0, 1, 2, 3 lookTarget.target = targets[randIdx]; } //다음 발사까지 남은시간 //1.0f / this.firePerSec; //} Invoke("RefireReady", 1.0f / this.firePerSec); }