유니티 게임 소스코드 공개합니다.
오늘 두시간동안 잠깐 테스트해 볼려고 만들어 봤어요. 게임 소스코드도 같이 올리니 필요하신 분들은 참고만 하세요 ㅋㅋ 별로 도움 안되는 내용일 수도 있어요.
게임 방법
원숭이 움직이기 : 키보드 좌우 방향키
원숭이 점프하기 : 키보드 스페이스키
게임구성
CameraController : 카메라 이동
원숭이 케릭터를 중심으로 카메라 시점을 이동시켜줍니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraController : MonoBehaviour {
private Vector3 offset;
private GameObject monkey;
// Use this for initialization
void Start () {
monkey = GameObject.Find("Monkey");
offset = this.transform.position - monkey.transform.position;
}
// Update is called once per frame
void LateUpdate () {
transform.position = offset + monkey.transform.position;
}
}
Monkey : 플레이어(원숭이) 제어 스크립트
원숭이를 움직이고 지면과 닿아 있을때만 점프 할 수 있도록 구현되어 있습니다. 적과 부딪칠경우에 HP가 떨어지는 코드는 구현전은 함정
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Monkey : MonoBehaviour {
public float speed;
public float jumpForce;
public int hp;
private BoxCollider2D footer;
private Rigidbody2D rb2d;
private Animator anim;
private bool isJumping;
// Use this for initialization
void Start () {
footer = GetComponent<BoxCollider2D>();
rb2d = GetComponent<Rigidbody2D> ();
anim = GetComponent<Animator> ();
isJumping = false;
hp = 100;
}
// Update is called once per frame
void FixedUpdate () {
float h = Input.GetAxis ("Horizontal");
bool isRunning = (Mathf.Abs(h)) > 0;
anim.SetBool("IsRun", isRunning);
if (h > 0) transform.localScale = new Vector2(1, 1);
if (h < 0) transform.localScale = new Vector2(-1, 1);
transform.position += new Vector3(h, 0, 0).normalized * speed * Time.deltaTime;
if (!isJumping && Input.GetKeyDown (KeyCode.Space))
rb2d.AddForce(new Vector2(0, jumpForce));
}
private void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.tag == "Island")
{
isJumping = false;
anim.SetBool("IsJumping", isJumping);
}
}
private void OnCollisionExit2D(Collision2D collision)
{
if (collision.gameObject.tag == "Island")
{
isJumping = true;
anim.SetBool("IsJumping", isJumping);
}
}
public void TakeDamage(int amount)
{
hp -= amount;
if(hp <= 0)
{
// Gameover here
int a = 10;
}
}
}
GroundGenerator : 땅 자동 생성코드
지면을 자동으로 생성해 주는 코드입니다. 그냥 가장 간단하게 스테이지 별로 땅을 몇개 생성할 것인지, 땅간에 거리를 얼마나 둘 것인지는 가장 간단한 방법으로 구현했습니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GroundGenerator : MonoBehaviour {
public GameObject[] grounds;
private void Start()
{
int stage = PlayerPrefs.GetInt("Stage");
GenerateGround(stage);
}
void GenerateGround(int stage)
{
int NbOfGrounds = (stage + 10) * 10;
Vector2 location = new Vector2(0, -5);
for (int i = 0; i < NbOfGrounds; i++)
{
int rndGroundIdx = Random.Range(0, 2);
GameObject newGround = Instantiate(grounds[rndGroundIdx], this.transform, false);
newGround.transform.SetParent(this.transform);
newGround.transform.position = location;
// set next location
location.x += Random.Range(3.5f, 5.5f);
float height = Random.Range(0.5f, 1.5f);
location.y += Random.Range(0, 1) == 0 ? height : -height;
}
}
}
Fruits : 원숭이가 과일을 먹었을때 나타나는 파티클 효과와 UI 카운터
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Fruits : MonoBehaviour {
public string fruitName;
private void OnTriggerEnter2D(Collider2D collision)
{
if(collision.tag == "Player")
{
if (fruitName == "banana")
{
GameObject.Find("Canvas").GetComponent<UIController>().TakeBanana(Random.Range(1, 5));
GameObject toInstanciate = Resources.Load<GameObject>("Prefabs/ParticleBanana");
GameObject particle = Instantiate(toInstanciate);
GameObject itemHolder = GameObject.Find("Items");
particle.transform.SetParent(itemHolder.transform);
particle.transform.position = this.transform.position;
DestroyObject(particle, 3.0f);
}
else if (fruitName == "pineapple")
{
GameObject.Find("Canvas").GetComponent<UIController>().TakePineapple(Random.Range(1, 5));
GameObject toInstanciate = Resources.Load<GameObject>("Prefabs/ParticlePineapple");
GameObject particle = Instantiate(toInstanciate);
GameObject itemHolder = GameObject.Find("Items");
particle.transform.SetParent(itemHolder.transform);
particle.transform.position = this.transform.position;
DestroyObject(particle, 3.0f);
}
DestroyObject(gameObject);
}
}
}
Enermy : 적 제어 스크립트
아직은 플레이어(원숭이)와 부딪혔을경우에 재생되는 애니메이션을 제외하고는 아무것도 구현되어 있지 않습니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Enermy : MonoBehaviour {
private Animator anim;
// Use this for initialization
void Start () {
anim = GetComponent<Animator>();
}
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.tag == "Player")
{
anim.SetTrigger("Attack");
}
}
}
이상입니다 ㅎㅎㅎ
프로젝트 전체를 올릴려고하니까 용량이 너무 크네요. 필요하신 분은 메일 주소 남겨주시면 보내드릴께요.
'개발 > 정보' 카테고리의 다른 글
유니티 앱배포전에 꼭 해야할일 - 앱평가 (Rating) 간단하게 구현하기 (0) | 2017.06.13 |
---|---|
Unity Button에 AddListener 직접구현하는 방법 (0) | 2017.06.13 |
유니티에 Admob 광고 간단하게 구현하는 방법 (Singleton pattern 사용) (0) | 2017.06.12 |
유니티에서 PC, Max & Linux Standalone 항목이 사라졌어요 (0) | 2017.06.12 |
유니티 컴파일 오류 해결 방법 (Unable to install APK to device. Please make sure the Android SDK) (4) | 2017.05.29 |
Unity 3D Character rotating without any key press (0) | 2017.05.18 |
유니티 케릭터 회전 계속될 경우 중지하는 방법 (0) | 2017.05.18 |
유니티 네트워크 문제 - 클라이언트 위치정보 업데이트 안됨 (1) | 2017.05.17 |
최근댓글