2013년 6월 12일 수요일

hp bar(2/2) - 그림 붙이기







아래는 게임에 사용될 바 이미지 입니다.
위에 것은
barTexture.png 이고 아래 것은 bgbarTexture.png 입니다.





-----------------------------------------------------
using UnityEngine;

using System.Collections;

public class ywplayerbar : MonoBehaviour {
public float maxBar = 100.0f;
public float justBar = 100.0f;

public Texture2D barTexture;
public Texture2D bgbarTexture;

public float barLength;

float bgjustBar = 100.0f;
float bgbarLength;
//float bgbarheight;

// Use this for initialization
void Start () {
barLength = Screen.width /2; // 바의 유니티 상 크기
bgbarLength = Screen.width /2; // 바 외곽의 유니티상...
}

// Update is called once per frame
void Update () {
AddjustCurrentBar(-3); // 1초에 얼마씩 줄일 것인지....

}

void OnGUI(){
//simplemode = 세가지 제공.. 그중 아래는 사간 화면 꽉 제운것...  true = 알파 브랜딩 오케이
GUI.DrawTexture(new Rect(13,10, barLength, 30), barTexture, ScaleMode.StretchToFill, true, 0.0F);
GUI.DrawTexture(new Rect(10,10, bgbarLength, 30), bgbarTexture, ScaleMode.StretchToFill, true, 0.0F);


// 박스로 작업한것에서.... 위에 드로우 텍스쳐로 바꾼 것은... 그림이 맘대로 제어되지 않았기 때문입니다.
//GUI.Box(new Rect(10,10,bgbarLength,20),bgbarTexture);
//GUI.Box(new Rect(10,10,barLength,20),barTexture);

}

public void AddjustCurrentBar(float adj){

justBar += adj * Time.deltaTime; // 1초에 얼마씩 줄일것인지.... 하는 변수

if(justBar<0) // 현재가 0보다 작으면...
justBar =0;
if(justBar>maxBar) // 현재가 맥스보다 크면..
justBar=maxBar; // 둘은 동일...
if(maxBar<1) // 맥스가 1보다 작으면...
maxBar=1;


barLength = (Screen.width/2)*(justBar/(float)maxBar);
// 빠지는 수치만큼 줄여나간다...
// 원래 크기에서...

}


}


생각보다 어려웟다는... 별다른 자료도 없고...
도데체 박스로 만들어 놓거나...

갭슐만 만든 예제는 결국 더 고민하게 만든다는...




hp bar(1/2) - 기본

using UnityEngine;
using System.Collections;

public class ywplayerbar : MonoBehaviour {
public float maxBar = 100.0f;
public float justBar = 100.0f;
public float bgjustBar = 100.0f;
public float barLength;
public float bgbarLength;

// Use this for initialization
void Start () {
barLength = Screen.width /2;
bgbarLength = Screen.width /2;
}

// Update is called once per frame
void Update () {
AddjustCurrentBar(-3);

}

void OnGUI(){

GUI.Box(new Rect(10,10,barLength,20),justBar + "/"+ maxBar);
GUI.Box(new Rect(10,10,bgbarLength,20),bgjustBar + "/"+ maxBar);
}

public void AddjustCurrentBar(float adj){

justBar += adj * Time.deltaTime;

if(justBar<0)
justBar =0;
if(justBar>maxBar)
justBar=maxBar;
if(maxBar<1)
maxBar=1;


barLength = (Screen.width/2)*(justBar/(float)maxBar);


}


}

unity3d 중요 팁

1) 백 버튼... 처리

if(Input.GetKeyDown(KeyCode.Escape)){ // 백버튼이 눌리면


}


2) 시간 경과 처리
var gameLength : float; // 제한 시간 길이
private var elapsed : float =0; // 체크 시간

elapsed += Time.deltaTime; // 체크 시간에 시간을 더한다. 제한시간보다 커지면 씬 전환..
if(elapsed >=gameLength){

GameController.SendMessage("PlayScene",1);
}

3) 터치하면

if(Input.touches.Length>0){

GameController.SendMessage("PlayScene",2);


}


4) 오브젝트 간에 이동을 동일하게...
var player : GameObject; // 플레이어를 담고
var pixcamera : float; // 카메라 영점을 맞춘다..

스타트 함수나... 업데이트 함수에..
var playerposition = player.transform; // 플레이어 트랜스폼을
var move = playerposition.position.y + pixcamera; // 픽스카메라 만큼 위치를 보정

transform.position.y = move;  // 카메라와 캐릭터는 이제 같이 움직인다.


5) 효과
1. 안개
   Edit/ Renderer Setting/ Fog
   
2. 바람 설정
GameObject>Create Other> WindZone

3. 눈
 Standard Assets/Particles/ Misc/Light Snow


6) 플랫폼 체크 //안드로이드면?

using UnityEngine;
using System.Collections;

public class example : MonoBehaviour {
    void Example() {
        if (Application.platform == RuntimePlatform.Android)
            Debug.Log("Do something special here!");
        
    }
}










smoothfollow2d

using UnityEngine;
using System.Collections;

public class smoothfollow2d : MonoBehaviour {

public Transform target; 따라갈 타겟을 정한다.
public float petX; // 펫이 위치할 x값
public float petY;

private Transform thisTransform; // 자신의 트랜스폼을 담을 변수.
        public float smoothTime = 0.3F;  // 따라가는 속도
        private float Velocity = 0.0F; //평균 속도?
// Use this for initialization
void Start () {



thisTransform = transform; // 변수에 담아 퍼포먼스에 영향을 최소화
}

// Update is called once per frame
void Update () {


float newPositionX = Mathf.SmoothDamp(thisTransform.position.x, target.position.x+petX, ref Velocity, smoothTime);
float newPositionY = Mathf.SmoothDamp(thisTransform.position.y, target.position.y+petY, ref Velocity, smoothTime);
       
        thisTransform.position = new Vector3(newPositionX, newPositionY, thisTransform.position.z);



}
}

캐릭터 컨트롤러를 통한 이동... (2d 화면뷰에서는 사용할수 없다.)

using UnityEngine;
using System.Collections;
[RequireComponent(typeof(CharacterController))]

public class cube : MonoBehaviour {
    public float speed = 6.0F;
    public float jumpSpeed = 8.0F;
    public float gravity = 20.0F;
    private Vector3 moveDirection = Vector3.zero;


    void Update() {
        CharacterController controller = GetComponent<CharacterController>(); // 캐릭터 콘트롤러 참조
        if (controller.isGrounded) { // 땅에 있으면
            moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")); // 전후좌우 조정
            moveDirection = transform.TransformDirection(moveDirection); .. 축을 바꾼다. 월드 좌표로
            moveDirection *= speed;  // 움직임의 속도를 제어...
            if (Input.GetButton("Jump")) // 점프 버튼 누르면

                moveDirection.y = jumpSpeed;  // 해당 y값에 대입... 점프 한다.
           
        }
        moveDirection.y -= gravity * Time.deltaTime;  // y값에 조절 중력 가속도라고 보면 된다.
        controller.Move(moveDirection * Time.deltaTime);  // 콘트롤러는 이 모든 데이터를 참조하여 움직인다.. 시간 개념으로..
    }
}

캐릭터 콘트롤러...
이걸로 2D로 사용하려고 바보같은 짓을 했다..
일단 이건.. 중력값을 가지고 시작하는 것...

기본적으로 바닥이 있다는 전제하에 움직인다...
삽질 끝...

이런 간단한것들이... 괴롭힌다..

2013년 6월 11일 화요일

게임 제어 -


public enum GameState { playing, gameover }; // 게임 스테이트

public class GameControl : MonoBehaviour {

    public Transform platformPrefab; // 판떼기.. 이거 앞으로 막 쓸거.. 과일도 이것으로
    public static GameState gameState; // 현재 게임 상태

    private Transform playerTrans;  // 특정 트랜스 폼을 담기 위한 변수
    private float platformsSpawnedUpTo = 0.0f; // 얼마나 위에서 나타날 것인가?
    private ArrayList platforms; // 플랫폼 배열
    private float nextPlatformCheck = 0.0f;  // 담에 어디서 나타날 것인가?

 
void Awake () {
        playerTrans = GameObject.FindGameObjectWithTag("Player").transform; // 플레이어의 트랜스 폼을 찾는다.
        platforms = new ArrayList(); // 배열을 참조하고..

        SpawnPlatforms(25.0f);
        StartGame(); // 게임 시작


}

    void StartGame()
    {
        Time.timeScale = 1.0f;  // 게임진행
        gameState = GameState.playing; // 게임변수 변화
    }

    void GameOver()
    {
        Time.timeScale = 0.0f; //Pause the game
        gameState = GameState.gameover;
        GameGUI.SP.CheckHighscore();// 점수를 체크
    }

void Update () {
        //Do we need to spawn new platforms yet? (we do this every X meters we climb)
        float playerHeight = playerTrans.position.y;// 플레이어 의 위치를 참조...
        if (playerHeight > nextPlatformCheck)
        {
            PlatformMaintenaince(); //Spawn new platforms
        }

        //Update camera position if the player has climbed and if the player is too low: Set gameover.
        float currentCameraHeight = transform.position.y; // 카메라에 스크립트 붙어 있음... 카메라 위치를 참조
        float newHeight = Mathf.Lerp(currentCameraHeight, playerHeight, Time.deltaTime * 10);
        if (playerTrans.position.y > currentCameraHeight)
        {
            transform.position = new Vector3(transform.position.x, newHeight, transform.position.z); // 카메라 위치.
        }else{
            //Player is lower..maybe below the cameras view?
            if (playerHeight < (currentCameraHeight - 10))// 카메라와 캐릭터의 위치가 멀어지면 게임오바..
            {
                GameOver();
            }
        }

        //Have we reached a new score yet?
        if (playerHeight > GameGUI.score)
        {
            GameGUI.score = (int)playerHeight;
        }
}



    void PlatformMaintenaince()
    {
        nextPlatformCheck = playerTrans.position.y + 10;

        //Delete all platforms below us (save performance)
        for(int i = platforms.Count-1;i>=0;i--)
        {
            Transform plat = (Transform)platforms[i];
            if (plat.position.y < (transform.position.y - 10))
            {
                Destroy(plat.gameObject);
                platforms.RemoveAt(i);
            }          
        }

        //Spawn new platforms, 25 units in advance
        SpawnPlatforms(nextPlatformCheck + 25);
    }


    void SpawnPlatforms(float upTo) // 플랫폼 생성 같은데..
    {
        float spawnHeight = platformsSpawnedUpTo; 이 변수를 참조하고
        while (spawnHeight <= upTo) //작거나 같으면
        {
            float x = Random.Range(-10.0f, 10.0f); // 생성될 플랫폼의 x 위치를 랜덤하게 추출하고
            Vector3 pos = new Vector3(x, spawnHeight, 12.0f); // x위치 받고 높이 받고 z값은 생각좀 해봐야 함...

            Transform plat = (Transform)Instantiate(platformPrefab, pos, Quaternion.identity);  // plat 변수에.. 플랫폼 프리팹을 ,위치를 담고.. 생성?
            platforms.Add(plat); 배열에 집어 넣네?

            spawnHeight += Random.Range(1.6f, 3.5f); // 높이 값으로 체크 다음번 생성... 안에 있는 수치만큼 랜덤 y값을 더해서...
        }
        platformsSpawnedUpTo = upTo; // 다시 새 위치를 받는다.
    }

}

따라 다니는 팻 - yw_followPet.cs

팻이 따라오게 만드는 스크립트.. 쓸데 없이 고생 했다는...

using UnityEngine;
using System.Collections;

public class yw_followPet : MonoBehaviour {

    public Transform target; // 따라갈 타겟의 트랜스 폼
 
    private float relativeHeigth = 1.0f; // 높이 즉 y값
    private float zDistance = -1.0f;// z값 나는 사실 필요 없었다.
    private float xDistance = 1.0f; // x값
    public float dampSpeed = 2;  // 따라가는 속도 짧으면 타겟과 같이 움직인다.


void Start(){

// 타겟의 트랜스 폼을 가져 왔으면.. 변수에 담는 것이 옳으나.. 좀 헤깔려셔 패스

}

    void Update () {
        Vector3 newPos = target.position + new Vector3(xDistance, relativeHeigth, -zDistance); // 타겟 포지선에 해당 위치를 더해.. 즉 타겟 주변에 위치할 위치를 담는다.. 일정의 거리를 구하는 방법
        transform.position = Vector3.Lerp(transform.position, newPos, Time.deltaTime*dampSpeed); //그 둘 사이의 값을 더해 보정한다. 이렇게 되면 멀어지면 따라간다.
}
}


smoothdamp로 해도 무관한다..