플레이어의 체력 - PlayerHealth

|






Health - > 체력

repeatDamagePeriod -> 데미지를 받고나서 다시한번 받을때 까지 간격

ouch clips -> 아픈 사운드 종류별로;

Hurt Force -> 플레이어와 적 충돌시 발생되는 힘

Damage Amount -> 깍이는 체력양








healthBar -> 체력 바는 피봇 위치를 왼쪽으로 해준다.

healthScale -> 이값을 이용하여 체력 게이지의 크기를 줄여줌



OnCollisionEnter2D -> 캐릭터와 충돌 발생시


if(col.gameObject.tag == "Enemy")  

{

// ... and if the time exceeds the time of the last hit plus the time between hits...

if (Time.time > lastHitTime + repeatDamagePeriod) 

{

// ... and if the player still has health...

if(health > 0f)

{

// ... take damage and reset the lastHitTime.

TakeDamage(col.transform); 

lastHitTime = Time.time; 

}

}

}


Enemy 태그와 충돌시

그리고 repeatDamagePeriod 간격이 지날때만 실행 -> 인스펙터 창에서 조절 가능

체력이 0보다 클때는 TakeDamage 함수 실행



// If the player doesn't have health, do some stuff, let him fall into the river to reload the level.

else

{

// Find all of the colliders on the gameobject and set them all to be triggers.

Collider2D[] cols = GetComponents<Collider2D>();

foreach(Collider2D c in cols)

{

c.isTrigger = true;

}


// Move all sprite parts of the player to the front

SpriteRenderer[] spr = GetComponentsInChildren<SpriteRenderer>();

foreach(SpriteRenderer s in spr)

{

s.sortingLayerName = "UI";

}


// ... disable user Player Control script

GetComponent<PlayerControl>().enabled = false;


// ... disable the Gun script to stop a dead guy shooting a nonexistant bazooka

GetComponentInChildren<Gun>().enabled = false;


// ... Trigger the 'Die' animation state

anim.SetTrigger("Die");

}


체력이 0보다 작을때는(죽을때) 모든 물체의 충돌을 무시하기 위해서 모든 충돌체를 isTrigger 해주고

모든 스프라이트 렌더러의 레이어 값을 UI 로 설정해줌->최상위 오브젝트로(맨위에 보이게)

그리고 PlayerControl 스크립트를 꺼주어 캐릭터가 못움직이게 한다

Gun 스크립트를 꺼주어서 총을 발사를 못하게 한다.

마지막으로 죽는 애니메이션을 실행시킨다.





플레이어가 충돌시 실행되는 함수


void TakeDamage (Transform enemy)

{

// Make sure the player can't jump.

playerControl.jump = false;


// Create a vector that's from the enemy to the player with an upwards boost.

Vector3 hurtVector = transform.position - enemy.position + Vector3.up * 5f;


// Add a force to the player in the direction of the vector and multiply by the hurtForce.

rigidbody2D.AddForce(hurtVector * hurtForce);


// Reduce the player's health by 10.

health -= damageAmount;


// Update what the health bar looks like.

UpdateHealthBar();


// Play a random clip of the player getting hurt.

int i = Random.Range (0, ouchClips.Length);

AudioSource.PlayClipAtPoint(ouchClips[i], transform.position);

}


충돌발생시 점프를 못하게하고

적과 부딪힌 방향으로 캐릭터를 튕기게 해준다. -> rigidbody2D.AddForce(hurtVector * hurtForce);

그리고 체력을 깍고 UpdateHealthBar함수를 실행시켜 게임내에서 체력바를 적용되게 한다.

마지막으로 오디오 사운드를 실행시킴..



public void UpdateHealthBar ()

{

// Set the health bar's colour to proportion of the way between green and red based on the player's health.

healthBar.material.color = Color.Lerp(Color.green, Color.red, 1 - health * 0.01f);


// Set the scale of the health bar to be proportional to the player's health.

healthBar.transform.localScale = new Vector3(healthScale.x * health * 0.01f, 1, 1);

}


체력이 깍일수록 점점 빨간색으로 변함.

health 값으로 체력바의 길이 조절










체력바 에 붙는 스크립트

주인공위에 항상 따라다님.

ui_healthDisplay




Trackback 0 And Comment 0

플레이어 무기 발사 - gun 스크립트

|



프리팹을 생성해줄때 Rigidbody2D 로 생성해줄수도 있음.. 생성해주고 나서 리지드바디의 velocity 값을 수정해서 로켓이 발사되는 위치를 지정해줌.

transform.root -> 등을 사용하여 최상위 오브젝트에 접근한다.


Trackback 0 And Comment 0

주인공을 따라다니는 카메라

|


슈퍼마리오의 카메라 처럼 일정 거리에서는 카메라가 움직이지 않고 일정거리를 넘어갔을때만 카메라가 이동함.


// If the player has moved beyond the x margin...

if(CheckXMargin())

// ... the target x coordinate should be a Lerp between the camera's current x position and the player's current x position.

targetX = Mathf.Lerp(transform.position.x, player.position.x, xSmooth * Time.deltaTime);


// If the player has moved beyond the y margin...

if(CheckYMargin())

// ... the target y coordinate should be a Lerp between the camera's current y position and the player's current y position.

targetY = Mathf.Lerp(transform.position.y, player.position.y, ySmooth * Time.deltaTime);


-> 마진 체크 후 카메라 이동


->Lerp 가 결국에는 targetY에 대입이 되며 targetY값은 계속 증가 결국 플레이어의 위치값과 똑같아짐









// The target x and y coordinates should not be larger than the maximum or smaller than the minimum.

targetX = Mathf.Clamp(targetX, minXAndY.x, maxXAndY.x);

targetY = Mathf.Clamp(targetY, minXAndY.y, maxXAndY.y);


// Set the camera's position to the target position with the same z component.

transform.position = new Vector3(targetX, targetY, transform.position.z);


-> 카메라 최대 거리 제한






결국엔 히어로의 값이랑 메인카메라랑 값이 똑같아 져야 되지만 카메라의 위치를 제한을 둬서 일정거리까지는 이동을 하지 못함








Trackback 0 And Comment 0