
거미 위치를 받기 위한 객체
namespace spider
{
public class Random_position : MonoBehaviour
{
public GameObject spyder;
public GameObject spider;
public GameObject Player;
public Transform[] transform_list;
void Start()
{
InvokeRepeating("Spyder_position", 1f, 30f);
}
public void Spyder_position()
{
spyder.SetActive(false);
int position_num = Random.Range(0, transform_list.Length);
spider.transform.position = transform_list[position_num].transform.position;
spyder.SetActive(true);
}
}
}
1. 기존에 받아온 위치값들 중 하나의 위치를 거미의 위치로 할당
2. 거미 오브젝트 Active
거미 이동 및 애니메이션을 실행하기 위한 객체
namespace spider
{
public class Spyder_LookRotation : MonoBehaviour
{
Vector3 relativerPosition;
Quaternion playerRotation;
public GameObject Spyder_body;
public Transform target;
public Animator Spyder;
public GameObject[] eyes;
public Random_position reset_position;
public GameObject Player;
private int eyes_attack = 0;
public float r_speed = 0.1f;
public float m_speed;
bool rotating = false;
bool walking = false;
float wait;
float rotationTime;
void Start()
{
foreach (GameObject black_eyes in eyes)
black_eyes.SetActive(false);
}
private void OnEnable()
{
wait = Random.Range(0, 5);
rotationTime = 0;
rotating = true;
Spyder.Play("Spyder.IdleLookAroundNormal", 0, 1f);
StartCoroutine(Wait_time());
}
private void OnDisable()
{
Spyder.StopPlayback();
}
IEnumerator Wait_time()
{
yield return new WaitForSeconds(wait);
Spyder.speed = 0.5f;
StartCoroutine(rotate_delay());
}
// Update is called once per frame
void FixedUpdate()
{
relativerPosition = target.position - Spyder_body.transform.position;
playerRotation = Quaternion.LookRotation(relativerPosition);
if (rotating)
{
rotationTime += Time.deltaTime * r_speed;
Spyder_body.transform.rotation = Quaternion.Lerp(Spyder_body.transform.rotation, playerRotation, rotationTime);
}
if (walking)
{
Spyder_body.transform.position += Spyder_body.transform.forward * Time.deltaTime * m_speed;
}
}
void Walk()
{
Spyder_body.transform.position += Spyder_body.transform.forward * Time.deltaTime * m_speed;
}
void Check_Input()
{
StartCoroutine(Move_timer());
}
IEnumerator rotate_delay()
{
yield return new WaitForSeconds(1f);
Check_Input();
}
IEnumerator Move_timer()
{
Spyder.StopPlayback();
walking = true;
Spyder.Play("Spyder.CrawlNormal", 0, 1f);
}
private void OnTriggerEnter(Collider other)
{
if (other.tag == "Player")
{
walking = false;
Spyder.StopPlayback();
Spyder.Play("Spyder.ThrowSpiderWebThreat", 0, 0.25f);
StartCoroutine(Spider_Attack());
}
else if (other.tag == "Bullet")
{
if (eyes_attack <= eyes.Length)
{
Spyder.Play("Spyder.DeathNormal", 0, 0.25f);
eyes[eyes_attack].SetActive(true);
eyes_attack++;
StartCoroutine(spider_hit());
}
}
}
IEnumerator Spider_Attack()
{
walking = false;
yield return new WaitForSeconds(2.0f);
Spyder.StopPlayback();
Player.transform.position = new Vector3(Player.transform.position.x, Player.transform.position.y, Player.transform.position.z + 3);
reset_position.Spyder_position();
}
IEnumerator spider_hit()
{
yield return new WaitForSeconds(2.0f);
if (eyes_attack >= eyes.Length)
Destroy(Spyder_body);
reset_position.Spyder_position();
}
}
}
1. OnEnable()
- 생성 후 기다리는 시간 설정
- 바라보는 위치 변경(Update 메서드 실행)
- 기다리는 애니메이션 실행
2. Move_timer()
- 거미 이동 시작(Update 메서드 실행)
3. Player와 충돌시
- 걷기 애니메이션 종료
- 공격 애니메이션 실행
- 2초 뒤 Ramdom_position에 있는 위치 변경 메서드 실행
4. Bullet과 충돌시
- 걷기 애니메이션 종료
- 타격 애니메이션 실행
- 어택 카운트 증가 및 검정 눈 오브젝트 실행(빨간눈 가림용)
- 어택카운트가 눈의 오브젝트 개수보다 많아질 경우 거미 오브젝트 삭제

public class Select_Spiderweb : MonoBehaviour
{
[Header("Web Object(Add Collider, Particle)")]
public GameObject[] webs;
public GameObject[] webs_warnning;
void OnEnable()
{
StartCoroutine(selecte());
}
void OnDisable()
{
foreach (GameObject o in webs) o.SetActive(false);
}
IEnumerator selecte()
{
int active_wind = Random.Range(0, webs.Length - 5);
for (int i = 0; i <= active_wind; i++) // 활성화할 개수만큼 실행
{
int play_wind = Random.Range(0, webs.Length);
if (webs[play_wind].activeSelf == false) // 현 상태가 false일 경우
webs[play_wind].SetActive(true); // true로 변환
else
i--; // 현 상태가 true일 경우 반복문 1회 재실행
}
yield return new WaitForSeconds(2.0f);
for (int i = 0; i < webs_warnning.Length; i++) // 활성화할 개수만큼 실행
{
if (webs[i].activeSelf == true) // 현 상태가 true일 경우
webs_warnning[i].SetActive(true); // true로 변환
}
foreach (GameObject o in webs) o.SetActive(false);
yield return new WaitForSeconds(5.0f); // 5초간 대기
foreach (GameObject o in webs_warnning) o.SetActive(false);
StartCoroutine(selecte()); // 자신을 다시 호출
}
}
활성화할 거미줄을 선택하는 객체
1. 떨어지는 거미줄 실행
2. 일정시간 대기 후 떨어지는 오브젝트 비활성화, 바닥에 위치해 있는 오브젝트 활성화(위치는 매칭되어 있음.)
public class Spiderweb_move : MonoBehaviour
{
private Rigidbody web_rigidbody;
public Vector3 destination;
private float web_speed = 15f;
bool drop;
void OnEnable() // 오브젝트 활성화시
{
gameObject.transform.rotation = Quaternion.Euler(new Vector3(0, 0, 0));
destination = gameObject.transform.position; // 현재의 위치값을 destination에 저장
drop = true;
}
void OnDisable() // 오브젝트 비활성화시
{
gameObject.transform.position = destination; // 현재 오브젝트의 위치값을 초기 활성화 시의 위치 값으로 변경
gameObject.transform.rotation = Quaternion.Euler(new Vector3(0, 0, 0));
}
void Update()
{
if(drop)
gameObject.transform.position = gameObject.transform.position + new Vector3(0, Time.deltaTime*-web_speed, 0); // Y 축으로 이동
}
}
거미줄을 떨어뜨리기 위한 객체
1. 시작시의 오브젝트 위치값을 저장하고 종료시 저장한 위치값을 현재의 위치값으로 변경
2. 실행 중 오브젝트 Y축으로 떨어뜨리기
public class Web_debuff : MonoBehaviour
{
public Spyder_LookRotation spider_move;
public SmoothLocomotion player_move;
private void OnTriggerEnter(Collider other)
{
if(other.tag != "Untagged" && other.tag != "UI Trigger")
{
if (other.tag == "Player")
{
spider_move.m_speed = 5f;
player_move.MovementSpeed = 2.5f;
}
}
}
private void OnDisable()
{
spider_move.m_speed = 2f;
player_move.MovementSpeed = 5f;
}
private void OnTriggerExit(Collider other)
{
if (other.tag != "Untagged" && other.tag != "UI Trigger")
{
if (other.tag == "Player")
{
spider_move.m_speed = 2f;
player_move.MovementSpeed = 5f;
}
}
}
}
디버프 효과를 주기 위한 객체
1. 해당 객체(바닥 거미줄)과 충돌시 Spider과 Player의 이동 값 변화
2. 충돌에 벗어날시 디버프 전의 이동속도 수치로 돌아옴.
Spider Hunting 실행영상
'Project > Alice Project' 카테고리의 다른 글
| Window Mission (0) | 2022.02.14 |
|---|---|
| Cat Hunting (0) | 2022.02.13 |
| Inventory make (0) | 2022.02.13 |