@ 키 입력 부분은 Update() 에서 사용
@ 캐릭터 이동 코드, 애니메이션 X
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MoveFixedUpdate : MonoBehaviour
{
// 이동 구현
private Rigidbody rb;
public float moveSpeed = 5f; // 캐릭터 이동 속도
private float horizontal;
private float vertical;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
// 매 프레임 입력 받기
horizontal = Input.GetAxis("Horizontal");
vertical = Input.GetAxis("Vertical");
}
private void FixedUpdate()
{
CharacterMove();
}
public void CharacterMove()
{
// 키 입력 받기
Vector3 moveInput = new Vector3(horizontal, 0.0f, vertical);
// 입력 벡터 정규화 및 크기 조정
if (moveInput.magnitude > 1)
{
moveInput = moveInput.normalized;
}
// 새로운 위치 계산
Vector3 newPosition = rb.position + moveInput * moveSpeed * Time.fixedDeltaTime;
// Rigidbody 속도를 0으로 설정하여 미끄러짐 방지
//rb.velocity = Vector3.zero;
// MovePosition으로 새로운 위치로 이동
rb.MovePosition(newPosition);
}
}
@ 캐릭터 이동 + 점프 코드, 애니메이션 X
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MoveFixedUpdate : MonoBehaviour
{
// 이동 구현
private Rigidbody rb;
public float moveSpeed = 5f; // 캐릭터 이동 속도
private float horizontal;
private float vertical;
// 점프 구현
public float jumpHeight = 7f;
private bool jump;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
// 매 프레임 입력 받기
horizontal = Input.GetAxis("Horizontal");
vertical = Input.GetAxis("Vertical");
jump = Input.GetButtonDown("Jump");
if(jump)
{
CharacterJump();
}
}
private void FixedUpdate()
{
CharacterMove();
}
public void CharacterJump()
{
rb.AddForce(transform.up * jumpHeight, ForceMode.Impulse);
}
public void CharacterMove()
{
// 키 입력 받기
Vector3 moveInput = new Vector3(horizontal, 0.0f, vertical);
// 입력 벡터 정규화 및 크기 조정
if (moveInput.magnitude > 1)
{
moveInput = moveInput.normalized;
}
// 새로운 위치 계산
Vector3 newPosition = rb.position + moveInput * moveSpeed * Time.fixedDeltaTime;
// Rigidbody 속도를 0으로 설정하여 미끄러짐 방지
//rb.velocity = Vector3.zero;
// MovePosition으로 새로운 위치로 이동
rb.MovePosition(newPosition);
}
}
@ 캐릭터 이동 + 점프 + 애니메이션
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MoveFixedUpdate : MonoBehaviour
{
// 이동 구현
private Rigidbody rb;
public float moveSpeed = 5f; // 캐릭터 이동 속도
private float horizontal;
private float vertical;
// 점프 구현
public float jumpHeight = 7f;
private bool isJump;
private bool jump;
private bool isGrounded;
Animator animator;
void Start()
{
rb = GetComponent<Rigidbody>();
animator = GetComponent<Animator>();
}
void Update()
{
// 매 프레임 입력 받기
horizontal = Input.GetAxis("Horizontal");
vertical = Input.GetAxis("Vertical");
jump = Input.GetButtonDown("Jump");
if(jump && !isJump)
{
CharacterJump();
}
}
private void FixedUpdate()
{
CharacterMove();
}
public void CharacterJump()
{
if(jump && !isJump)
{
animator.SetBool("Jumping", true);
animator.SetTrigger("Jump");
rb.AddForce(transform.up * jumpHeight, ForceMode.Impulse);
isJump = true;
}
}
// 바닥과의 충돌 감지
void OnCollisionEnter(Collision collision)
{
if (collision.gameObject.CompareTag("Ground"))
{
animator.SetBool("Jumping", false);
isJump = false;
}
}
public void CharacterMove()
{
// 키 입력 받기
Vector3 moveInput = new Vector3(horizontal, 0.0f, vertical);
// 입력 벡터 정규화 및 크기 조정
if (moveInput.magnitude > 1)
{
moveInput = moveInput.normalized;
}
// 새로운 위치 계산
Vector3 newPosition = rb.position + moveInput * moveSpeed * Time.fixedDeltaTime;
// Rigidbody 속도를 0으로 설정하여 미끄러짐 방지
//rb.velocity = Vector3.zero;
// MovePosition으로 새로운 위치로 이동
rb.MovePosition(newPosition);
}
}
@ 각각 Transition Duration의 수치를 애니메이션에 맞게 세밀조정해서 자연스러운 점프 움직임 구현하기
@ 캐릭터 이동 + 점프 + 애니메이션 + 공중 어택 구현하기
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MoveFixedUpdate : MonoBehaviour
{
// 이동 구현
private Rigidbody rb;
public float moveSpeed = 5f; // 캐릭터 이동 속도
private float horizontal;
private float vertical;
// 점프 구현
public float jumpHeight = 7f;
private bool isJump;
private bool jump;
private bool isGrounded;
Animator animator;
void Start()
{
rb = GetComponent<Rigidbody>();
animator = GetComponent<Animator>();
}
void Update()
{
// 매 프레임 입력 받기
horizontal = Input.GetAxis("Horizontal");
vertical = Input.GetAxis("Vertical");
jump = Input.GetButtonDown("Jump");
CharacterJump();
JumpAttack();
}
private void FixedUpdate()
{
CharacterMove();
}
public void CharacterJump()
{
if(jump && !isJump) // 키 입력받고 isJump가 false면 아래 코드 진행
{
animator.SetTrigger("Jump"); // 점프 스타트 jump start
animator.SetBool("Jumping", true); // 점프 중 jump air
rb.AddForce(transform.up * jumpHeight, ForceMode.Impulse);
isJump = true; // 점프중
}
}
// 점프 공격
public void JumpAttack()
{
if (Input.GetMouseButtonDown(1)) // 마우스 우클릭
{
// 공중에서 떨어지지않고 멈춰서 애니메이션 동작하도록 Kinematic 활성화
rb.isKinematic = true;
animator.SetTrigger("JumpAttack"); // 점프 도중 공격
// 2초뒤 다시 떨어지도록 Kinematic 비활성화
Invoke("AttackTime", 1.3f);
}
}
public void AttackTime()
{
// Kinematic 비활성화
rb.isKinematic = false;
}
// 바닥과의 충돌 감지
void OnCollisionEnter(Collision collision)
{
if (collision.gameObject.CompareTag("Ground"))
{
animator.SetBool("Jumping", false); // 점프 착지 jump landing
isJump = false; // 점프 끝
}
}
public void CharacterMove()
{
// 키 입력 받기
Vector3 moveInput = new Vector3(horizontal, 0.0f, vertical);
// 입력 벡터 정규화 및 크기 조정
if (moveInput.magnitude > 1)
{
moveInput = moveInput.normalized;
}
// 새로운 위치 계산
Vector3 newPosition = rb.position + moveInput * moveSpeed * Time.fixedDeltaTime;
// Rigidbody 속도를 0으로 설정하여 미끄러짐 방지
//rb.velocity = Vector3.zero;
// MovePosition으로 새로운 위치로 이동
rb.MovePosition(newPosition);
}
}
공격 애니메이션에서 Root Trasform Position, Rotation을 체크 및 해제 해가면서 원하는 애니메이션 구현하기.
UI - 캐릭터 HP 바 만들기 (0) | 2024.07.19 |
---|---|
Vector3.magnitude 벡터 크기, 벡터 정규화 (1) | 2024.07.17 |
유니티 캐릭터 자동회전 방지, 물체 확인용 레이 그리기 (0) | 2024.07.17 |
유니티 캐릭터 트레일 효과 만들기, 분신 효과 (1) | 2024.07.14 |
유니티 시네머신 가상카메라 (0) | 2024.07.09 |