当たり判定をつける
1, Playerの当たり判定をつけたい部位にMeshRenderer、MeshColliderかBoxColliderを付ける
メッシュの形、大きさを調整する
2, 敵にCapsuleColliderを付け、isTriggerをチェック、Colliderの大きさを調整する
3, EnemyMnagerに下記スクリプトを追加し、動作確認する
private void OnTriggerEnter(Collider other) // 当たり判定
{
Debug.Log("接触(敵)");
}
6, PlayerManagerに下記スクリプトを追加し、動作確認する
private void OnTriggerEnter(Collider other) // 当たり判定
{
Debug.Log("接触(プレーヤー)");
}
ダメージを実装
2, Damager.cs、Playermanager,Enemymanagerに下記のスクリプトを記述
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Damager : MonoBehaviour
{
public int damage;
}
private void OnTriggerEnter(Collider other)
{
Damager damager = other.GetComponent<Damager>();
if (damager != null)
{
//ダメージを与えるものにぶつかったら
Debug.Log("プレーヤーはダメージをうける");
}
}
private void OnTriggerEnter(Collider other)
{
Damager damager = other.GetComponent<Damager>();
if (damager != null)
{
//ダメージを与えるものにぶつかったら
Debug.Log("敵はダメージをうける");
}
}
ダメージアニメーションの実装
1, アニメーションを配置し、AnyStateからMakeTransitionをつける
3, 下記コメント部分のコードを追加
private void OnTriggerEnter(Collider other)
{
Damager damager = other.GetComponent<Damager>();
if (damager != null)
{
//ダメージを与えるものにぶつかったら
animator.SetTrigger("Hurt");
}
}
private void OnTriggerEnter(Collider other)
{
Damager damager = other.GetComponent<Damager>();
if (damager != null)
{
//ダメージを与えるものにぶつかったら
animator.SetTrigger("Hurt");
}
}
攻撃の判定
2, playerManagerに下記コメント部分のスクリプトを書く
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerManager : MonoBehaviour
{
float x;
float z;
public float moveSpeed;
public Collider punchCollider; //設定する
public Collider kickCollider;
Rigidbody rb;
Animator animator;
void Start()
{
rb = GetComponent<Rigidbody>();
animator = GetComponent<Animator>();
HideColliderPunch(); //最初は隠しておく
HideColliderKick();
}
void Update()
{
x = Input.GetAxisRaw("Horizontal");
z = Input.GetAxisRaw("Vertical");
//攻撃
if (Input.GetKeyDown(KeyCode.V))
{
animator.SetTrigger("Attack");
}
else if (Input.GetKeyDown(KeyCode.C))
{
animator.SetTrigger("Kick");
}
else if (Input.GetKeyDown(KeyCode.Space))
{
animator.SetTrigger("Jump");
}
else if (Input.GetKeyDown(KeyCode.M))
{
animator.SetTrigger("Brooklyn");
}
}
void FixedUpdate()
{
Vector3 direction = transform.position + new Vector3(x, 0, z) * moveSpeed;
transform.LookAt(direction);
rb.velocity = new Vector3(x, 0, z) * moveSpeed;
animator.SetFloat("Speed", rb.velocity.magnitude);
}
//攻撃の判定
public void HideColliderPunch()
{
punchCollider.enabled = false; //無効にする
}
public void ShowColliderPunch()
{
punchCollider.enabled = true; //有効にする
}
public void HideColliderKick()
{
kickCollider.enabled = false; //無効にする
}
public void ShowColliderKick()
{
kickCollider.enabled = true; //有効にする
}
private void OnTriggerEnter(Collider other)
{
Damager damager = other.GetComponent<Damager>();
if (damager != null)
{
animator.SetTrigger("Hurt");
}
}
}
3, 各攻撃にAdd eventで始まりと終わりを部分をつけ、Function部分でShowColliderPunch(), HideColliderPunch()を設定する
5, 敵も同様に設定する
プレイヤーが攻撃を受けても移動出来てしまうバグ修正
1, PlayerのGetHitを選択し、PlayerHurtBehaviourを作成する
2, 下記コードを記述
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerAttackBehaviour : StateMachineBehaviour
{
// OnStateEnter is called when a transition starts and the state machine starts to evaluate this state
override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
animator.GetComponent<PlayerManager>().moveSpeed = 0;
}
// OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks
override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
}
// OnStateExit is called when a transition ends and the state machine finishes evaluating this state
override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
animator.GetComponent<PlayerManager>().moveSpeed = 3;
}
// OnStateMove is called right after Animator.OnAnimatorMove()
//override public void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
//{
// // Implement code that processes and affects root motion
//}
// OnStateIK is called right after Animator.OnAnimatorIK()
//override public void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
//{
// // Implement code that sets up animation IK (inverse kinematics)
//}
}
攻撃を受けた時に何度もアニメーションが実行されてしまうバグ修正
1, EnemyHurtBehaviourとplayerHurtBehaviourに下記コメント部分のコードを追加する
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class EnemyHurtBehaviour : StateMachineBehaviour
{
// OnStateEnter is called when a transition starts and the state machine starts to evaluate this state
override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
animator.ResetTrigger("Hurt"); //攻撃を受けたらリセットする
animator.GetComponent<NavMeshAgent>().speed = 0;
}
// OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks
//override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
//{
//}
// OnStateExit is called when a transition ends and the state machine finishes evaluating this state
override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
animator.ResetTrigger("Hurt"); //抜けるときもリセットする
}