[VR검투사] 7일차
페이지 정보
작성자 손호준 작성일17-06-27 18:49 조회2,014회 댓글0건첨부파일
- KakaoTalk_Video_20170627_1838_19_878.mp4 (2.3M) 7회 다운로드 DATE : 2017-06-27 18:49:12
관련링크
본문
-손호준-
어제하던 고양이 게임을 마저 구현 했습니다.
총알끼리 부딪쳐서 위로 날라가는 현상을 막기위해 emptyObject를 하나 생성하여 IsTrigger를 설정한다음 총알이 닿이면 사라지게 만들었고
private void OnTriggerEnter(Collider coll)
{
if (coll.tag == "Bullet" || coll.tag == "RedBullet")
{
Destroy(coll.gameObject);
}
}
Hp 와 기록 Time을 만들어서 UI화면에 띄우고 HP가 0이 되는순간 GameOver 장면이 뜨게 만들었으며
GameOver 상태에서 Y를 누를시 다시 시작하도록 만들었습니다.
void Update () {
if (gameOver && Input.GetKeyDown(KeyCode.Y))
{
Application.LoadLevel(Application.loadedLevel);
PlayerCtr.hp = 10;
}
}
그리고 하늘에서 폭탄들이 랜덤한 위치에서 내려와 땅에 닿이면 5초간 기다리게 하고 난 후 터지게 만들었습니다.
private void OnTriggerEnter(Collider other)
{
if(other.tag == "Ground")
{
StartCoroutine("Explosion", count);
}
}
IEnumerator Explosion(float count)
{
yield return new WaitForSeconds(count);
Debug.Log("Explosion");
Collider[] colls = Physics.OverlapSphere(transform.position, 10f);
foreach(Collider coll in colls)
{
Rigidbody rbody = coll.GetComponent<Rigidbody>();
if(rbody != null)
{
rbody.mass = 1f;
rbody.AddExplosionForce(1000f, tr.position, 10f, 300f);
}
}
Destroy(this.gameObject);
}
폭탄 생성 위치를 만들어 랜덤하게 이동하게 만들었습니다.
IEnumerator BombCreat(float delay)
{
yield return new WaitForSeconds(delay);
v3.x = Random.Range(-49f, 49f);
v3.y = 10f;
v3.z = Random.Range(-49f, 49f);
rigidbody.MovePosition(v3);
Instantiate(bomb, tr.position, tr.rotation);
StartCoroutine("BombCreat", delay);
}
-이성현 조충진-
오늘은 아두이노 모듈들을 만져보았습니다 서보모터를 포함해 터치모듈, 온도감지모듈, 진동모듈 을 만져보았고
내일은 더많은 모듈들을 만져볼 예정입니다
#include<Servo.h> //Servo 라이브러리를 추가
Servo servo; //Servo 클래스로 servo객체 생성
int value = 0; // 각도를 조절할 변수 value
void setup() {
servo.attach(7); //맴버함수인 attach : 핀 설정
Serial.begin(9600); //시리얼 모니터 사용 고고
}
void loop() {
if(Serial.available()) //시리얼 모니터에 데이터가 입력되면
{
char in_data; // 입력된 데이터를 담을 변수 in_data
in_data = Serial.read(); //시리얼모니터로 입력된 데이터 in_data로 저장
if(in_data == '1') //입력된 데이터가 1이라면
{
value += 30; //각도를 30도 증가시킨다.
if(value == 210) //각도가 210도가 되면 (180도보다 커지면)
value = 0; //각도를 0으로 초기화
}
else //그외의 데이터가 입력되면
value = 0; //각도를 0으로 초기화
servo.write(value); //value값의 각도로 회전. ex) value가 90이라면 90도 회전
}
}
동영상 첨부합니다
-서정호-
오늘은 배럴의 폭발과 랜덤한 위치에 떨어지게 하였고 캐릭터의 총발포와 총궤적을 나타내었고 배경맵을 설정하였습니다 아직 미흡한점이많고 배럴위치를 나타낼때에는 구글링을 하기엔 너무 모르는것이 많아 옆에서 조언을 받았고 다음에할땐 배럴뿐만아니라 다른 컨텐츠 제작도 해야겟다고 생각하였습니다
-성기헌-
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
[RequireComponent (typeof (NavMeshAgent))]
public class Enemy : LivingEntity
{
public enum State { Idle, Chasing, Attacking};
State currentState;
NavMeshAgent pathfinder;
Transform target;
LivingEntity targetEntity;
Material skinMaterial;
Color originalColour;
float attackDistanceThreshold = .5f;
float timeBetweenAttacks = 1;
float damage = 1;
float nextAttackTime;
float myCollisionRadius;
float targetCollisionRadius;
bool hasTarget;
protected override void Start()
{
base.Start();
pathfinder = GetComponent<NavMeshAgent>();
skinMaterial = GetComponent<Renderer>().material;
originalColour = skinMaterial.color;
if (GameObject.FindGameObjectWithTag("Player") != null)
{
currentState = State.Chasing;
hasTarget = true;
target = GameObject.FindGameObjectWithTag("Player").transform;
targetEntity = target.GetComponent<LivingEntity>();
targetEntity.OnDeath += OnTargetDeath;
myCollisionRadius = GetComponent<CapsuleCollider>().radius;
targetCollisionRadius = target.GetComponent<CapsuleCollider>().radius;
StartCoroutine(UpdatePath());
}
}
void OnTargetDeath()
{
hasTarget = false;
currentState = State.Idle;
}
void Update () {
if(hasTarget) {
if (Time.time > nextAttackTime)
{
float sqrDstToTarget = (target.position - transform.position).sqrMagnitude;
if (sqrDstToTarget < Mathf.Pow(attackDistanceThreshold + myCollisionRadius + targetCollisionRadius, 2))
{
nextAttackTime = Time.time + timeBetweenAttacks;
StartCoroutine(Attack());
}
}
}}
IEnumerator Attack()
{
currentState = State.Attacking;
pathfinder.enabled = false;
Vector3 originalPosition = transform.position;
Vector3 dirToTarget = (target.position - transform.position).normalized;
Vector3 attackPosition = target.position - dirToTarget * (myCollisionRadius);
float attackSpeed = 3;
float percent = 0;
skinMaterial.color = Color.red;
bool hasAppliedDamage = false;
while (percent <= 1)
{
if(percent >= .5f && !hasAppliedDamage)
{
hasAppliedDamage = true;
targetEntity.TakeDamage(damage);
}
percent += Time.deltaTime * attackSpeed;
float interpolation = (-Mathf.Pow(percent, 2) + percent) * 4;
transform.position = Vector3.Lerp(originalPosition, attackPosition, interpolation);
yield return null;
}
skinMaterial.color = originalColour;
currentState = State.Chasing;
pathfinder.enabled = true;
}
IEnumerator UpdatePath()
{
float refreshRate = .25f;
while (hasTarget)
{
if (currentState == State.Chasing)
{
Vector3 dirToTarget = (target.position - transform.position).normalized;
Vector3 targetPosition = target.position - dirToTarget * (myCollisionRadius + targetCollisionRadius + attackDistanceThreshold/2);
if (!dead)
{
pathfinder.SetDestination(targetPosition);
}
}
yield return new WaitForSeconds(refreshRate);
}
}
}
몬스터 생성 및 추적기능을 넣고 데미지를 입으면 삭제되는방식으로 스크립트를 작성하였습니다.
그리고 몬스터에 공격모션을 넣어 좀더 구체적인 공격모션을 볼수있게 설정했고 사용자가 피격시
HP가 줄어들어 죽는것까지 구현하였으며 다음 스테이지로 넘어갈때 몬스터가 자동으로 생성되도록
구현하였습니다.
코멘트 하나만 남겨 주시면 안될까요? *^^*
댓글목록
등록된 댓글이 없습니다.
최신댓글