| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
Tags
- Lua language
- Lua 설명
- 메이플스토리
- c언어 콘서트 배열 2번
- 비주얼 스튜디오
- N Queens Problem
- 게임제작
- c언어 배열 programming
- lua 다운로드
- c샾 hello world
- N Queen Coordinates
- c#온라인
- 루아다운로드
- 비주얼 스튜디오 다운로드
- lua download
- 온라인 비주얼 스튜디오
- c샾 헬로우 월드
- 유니티
- 2중 반복문
- c++ 등차수열 합
- c언어 버블정렬
- Lua란
- c언어 콘서트 배열
- C언어 달력
- c언어 최대최소
- N Queen 문제
- for문
- c sharp hello world
- 루아
- LUA
Archives
- Today
- Total
Ln Go
Player 본문
using System.Collections;
using UnityEngine;
public class Player : MonoBehaviour
{
public float speed;
public GameObject[] weapons;
public bool[] hasWeapons;
public GameObject[] grenades;
public int hasGrenades;
public GameObject grenadeObj;
public Camera followCamera;
public GameManager manager;
//public AudioSource jumpSound;
//AudioSource Inspector Play On Awake uncheck
public int ammo;
public int coin;
public int health;
public int score;
public int maxAmmo;
public int maxCoin;
public int maxHealth;
public int maxHasGrenades;
float hAxis;
float vAxis;
bool wDown;
bool jDown;
bool iDown;
bool fDown;
bool gDown;
bool rDown;
bool sDown1;
bool sDown2;
bool sDown3;
bool isReload;
bool isJump;
bool isDodge;
bool isSwap;
bool isFireReady = true;
bool isBorder;
bool isDamage;
bool isShop;
bool isDead;
Vector3 moveVec;
Vector3 dodgeVec;
Rigidbody rigid;
Animator anim;
MeshRenderer[] meshs;
GameObject nearObject;
public Weapon equipWeapon;
int equipWeaponIndex = -1;
float fireDelay;
void Awake()
{
rigid = GetComponent<Rigidbody>();
anim = GetComponentInChildren<Animator>(); //Component
meshs = GetComponentsInChildren<MeshRenderer>(); //Components
PlayerPrefs.SetInt("MaxScore", 112500);
//Debug.Log(PlayerPrefs.GetInt("MaxScore"));
}
// Update is called once per frame
void Update()
{
GetInput();
Move();
Turn();
Jump();
Attack();
Grenade();
Reload();
Dodge();
Swap();
StopToWall();
Interation(); //상호작용
OnDamage(true);
}
void GetInput()
{
hAxis = Input.GetAxisRaw("Horizontal");
vAxis = Input.GetAxisRaw("Vertical");
wDown = Input.GetButton("Walk");
jDown = Input.GetButtonDown("Jump");
fDown = Input.GetButton("Fire1");
gDown = Input.GetButtonDown("Fire2");
iDown = Input.GetButtonDown("Interation");
rDown = Input.GetButtonDown("Reload");
sDown1 = Input.GetButtonDown("Swap1");
sDown2 = Input.GetButtonDown("Swap2");
sDown3 = Input.GetButtonDown("Swap3");
}
void Move()
{
moveVec = new Vector3(hAxis, 0, vAxis).normalized;
if (isDodge)
moveVec = dodgeVec;
if (isSwap || !isFireReady || isReload || isDead)
moveVec = Vector3.zero;
if (!isBorder)
transform.position += moveVec * speed * (wDown ? 0.3f : 1f) * Time.deltaTime;
anim.SetBool("isRun", moveVec != Vector3.zero);
anim.SetBool("isWalk", wDown);
}
void Turn()
{
transform.LookAt(transform.position + moveVec);
//#2.마우스에 의한 회전 ScreenPointToRay(): 스크린에서 월드로 Ray를 쏘는 함수
if (fDown && !isDead)
{
Ray ray = followCamera.ScreenPointToRay(Input.mousePosition);
RaycastHit rayHit;
//out : return처럼 반환값을 주어진 변수에 저장하는 키워드
if (Physics.Raycast(ray, out rayHit, 100))
{
Vector3 nextVec = rayHit.point - transform.position;
nextVec.y = 0;
transform.LookAt(transform.position + nextVec);
}
}
}
void Jump()
{
if (jDown && (moveVec == Vector3.zero) && !isJump && !isDodge && !isSwap && !isDead)
{
rigid.AddForce(Vector3.up * 15, ForceMode.Impulse);
anim.SetBool("isJump", true);
anim.SetTrigger("doJump");
isJump = true;
//즉발적인 효과를 줄 수 있는 Impulse;
//jumpSound.Play();
}
}
void Grenade()
{
if (hasGrenades == 0)
return;
if (gDown && !isReload && !isSwap && !isDead)
{
Ray ray = followCamera.ScreenPointToRay(Input.mousePosition);
RaycastHit rayHit;
if (Physics.Raycast(ray, out rayHit, 100))
{
Vector3 nextVec = rayHit.point - transform.position;
nextVec.y = 20;
GameObject instantGrenade = Instantiate(grenadeObj, transform.position, transform.rotation);
Rigidbody rigidGrenade = instantGrenade.GetComponent<Rigidbody>();
rigidGrenade.AddForce(nextVec, ForceMode.Impulse);
rigidGrenade.AddTorque(Vector3.back * 10, ForceMode.Impulse);
hasGrenades--;
grenades[hasGrenades].SetActive(false);
}
}
}
void Attack()
{
if (equipWeapon == null)
return;
fireDelay += Time.deltaTime;
isFireReady = equipWeapon.rate < fireDelay;
if (fDown && isFireReady && !isDodge && !isSwap && !isShop && !isDead)
{
equipWeapon.Use();
anim.SetTrigger(equipWeapon.type == Weapon.Type.Melee ? "doSwing" : "doShot");
fireDelay = 0;
}
}
void Reload()
{
if (equipWeapon == null)
return;
if (equipWeapon.type == Weapon.Type.Melee)
return;
if (ammo == 0)
return;
if (rDown && !isJump && !isDodge && !isSwap && isFireReady && !isReload && !isDead)
{
anim.SetTrigger("doReload");
isReload = true;
Invoke("ReloadOut", 3f);
}
}
void ReloadOut()
{
int reAmmo = ammo < equipWeapon.maxAmmo ? ammo : equipWeapon.maxAmmo;
equipWeapon.curAmmo = reAmmo;
ammo -= reAmmo;
isReload = false;
}
void Dodge()
{
if (jDown && (moveVec != Vector3.zero) && !isJump && !isDodge && !isSwap && !isDead)
{
dodgeVec = moveVec;
speed = speed * 2;
anim.SetTrigger("doDodge");
isDodge = true;
//Invoke 함수로 시간차 함수 호출 Invoke(함수이름, 시간);
Invoke("DodgeOut", 0.5f);
}
}
void DodgeOut()
{
speed = speed * 0.5f;
isDodge = false;
}
void Swap()
{
if (sDown1 && (!hasWeapons[0] || equipWeaponIndex == 0))
return;
if (sDown2 && (!hasWeapons[1] || equipWeaponIndex == 1))
return;
if (sDown3 && (!hasWeapons[2] || equipWeaponIndex == 2))
return;
int weaponIndex = -1;
if (sDown1) weaponIndex = 0;
if (sDown2) weaponIndex = 1;
if (sDown3) weaponIndex = 2;
if ((sDown1 || sDown2 || sDown3) && !isJump && !isDodge && !isDead)
{
if (equipWeapon != null)
equipWeapon.gameObject.SetActive(false);
equipWeaponIndex = weaponIndex;
equipWeapon = weapons[weaponIndex].GetComponent<Weapon>();
equipWeapon.gameObject.SetActive(true);
anim.SetTrigger("doSwap");
isSwap = true;
Invoke("SwapOut", 0.4f);
}
}
void SwapOut()
{
isSwap = false;
}
void Interation()
{
if (iDown && nearObject != null && !isJump && !isDodge && !isDead)
{
if (nearObject.tag == "Weapon")
{
Item item = nearObject.GetComponent<Item>();
int weaponIndex = item.value;
hasWeapons[weaponIndex] = true;
Destroy(nearObject);
}
else if (nearObject.tag == "Shop")
{
Shop shop = nearObject.GetComponent<Shop>();
shop.Enter(this);
isShop = true;
}
}
}
void FreezeRotation()
{
//angularVelocity : 물리 회전 속도
rigid.angularVelocity = Vector3.zero;
}
void StopToWall()
{
// DrawRay() : Scene내에서 Ray를 보여주는 함수
Debug.DrawRay(transform.position, transform.forward * 5, Color.green);
// Raycast() : Ray를 쏘아 닿는 오브젝트를 감지하는 함수
isBorder = Physics.Raycast(transform.position, moveVec, 5, LayerMask.GetMask("Wall"));
}
void FixedUpdate()
{
FreezeRotation();
StopToWall();
}
void OnCollisionEnter(Collision collision)
{
if (collision.gameObject.tag == "Floor")
{
anim.SetBool("isJump", false);
isJump = false;
}
}
void OnTriggerEnter(Collider other)
{
if (other.tag == "Item")
{
Item item = other.GetComponent<Item>();
switch (item.type)
{
case Item.Type.Ammo:
ammo += item.value;
if (ammo > maxAmmo)
ammo = maxAmmo;
break;
case Item.Type.Coin:
coin += item.value;
if (coin > maxCoin)
coin = maxCoin;
break;
case Item.Type.Heart:
health += item.value;
if (health > maxHealth)
health = maxHealth;
break;
case Item.Type.Grenade:
if (hasGrenades == maxHasGrenades)
return;
grenades[hasGrenades].SetActive(true);
hasGrenades += item.value;
if (hasGrenades > maxHasGrenades)
hasGrenades = maxHasGrenades;
break;
}
Destroy(other.gameObject);
}
else if (other.tag == "EnemyBullet")
{
if (!isDamage)
{
Bullet enemyBullet = other.GetComponent<Bullet>();
health -= enemyBullet.damage;
bool isBossAtk = (other.name == "Boss Melee Area");
StartCoroutine(OnDamage(isBossAtk));
}
if (other.GetComponent<Rigidbody>() != null)
Destroy(other.gameObject);
}
}
IEnumerator OnDamage(bool isBossAtk)
{
isDamage = true;
foreach (MeshRenderer mesh in meshs)
{
mesh.material.color = Color.red;
}
if (isBossAtk)
rigid.AddForce(transform.forward * -25, ForceMode.Impulse);
if (health <= 0 && !isDead)
OnDie();
yield return new WaitForSeconds(1f);
isDamage = false;
foreach (MeshRenderer mesh in meshs)
{
mesh.material.color = Color.white;
}
if (isBossAtk)
rigid.velocity = Vector3.zero;
}
void OnDie()
{
anim.SetTrigger("doDie");
isDead = true;
manager.GameOver();
}
void OnTriggerStay(Collider other)
{
if (other.tag == "Weapon" || other.tag == "Shop")
nearObject = other.gameObject;
}
void OnTriggerExit(Collider other)
{
if (other.tag == "Weapon")
nearObject = null;
else if(other.tag == "Shop")
{
Shop shop = nearObject.GetComponent<Shop>();
shop.Exit();
isShop = false;
nearObject = null;
}
}
}
'Unity > Quad Action' 카테고리의 다른 글
| BossMissile (0) | 2021.06.04 |
|---|---|
| BossRock (0) | 2021.06.04 |
| Boss (0) | 2021.06.04 |
| Enemy (0) | 2021.06.04 |
| GameManager (0) | 2021.06.04 |
Comments