Last Updated 2024.03.13
週末Unity備忘録。
今回は当たり判定を正確……というか自然にするために不可欠な、BoxColliderのsize変更を実装しようとした際のお話と、注意点というか自分がやってしまった失敗についてです。
成功例
はじめに正解というか、実際に使用しているスクリプトがこちらになります。
▼BoxColliderのsizeを変更するサンプル
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class "任意" : MonoBehaviour
[SerializeField]
private BoxCollider hitBox;//当たり判定のCollider
private Animator animator;
void Start()
{
hitBox = GetComponent<BoxCollider>();
animator = GetComponent<Animator>();
}
void hitboxOn()//AnimationEventとして実装
{
hitBox.enabled = true;
hitBox.center = new Vector3(0.048f, 0.91f, 0.51f);
hitBox.size = new Vector3(.6f, .6f, .19f);
}
モーション中に設定された「hitboxOn」というAnimationEventを起動させる形を取りました。
ヒットボックスの中心点になる「center」と、大きさに該当する「size」に、Vector3型で値を入れています。一見、これといって躓くようなポイントは無いように見えますね。
BoxColliderが有効になった際、ちゃんと値が変わってるのが確認できます。
自分が陥った失敗
気付いてみたら本当に「なんでそんなミスに気付かないの?」ってお話なんですが、そこが初心者たる部分というか、単純に 視野が狭くて思考が硬い というか……
実は今回の件、かなり前に「ダメージを与える、受ける」仕組みを実装した際、ヒットボックスの実装とセットでやろうとしたときに出来なかった処理なんですよ。
というのも
当時も「hitboxOn」メソッド内の記述はほぼ一緒だったんですが
お馴染みの赤エラーCS1061
記述漏れとかスペルミスもなく、コルーチンの時みたいに原因が「public class ~ MonoBehaviour」より上にあるのかとも思ったのですが、それに該当しそうなものがないので原因がまったく解らず、結局ヒットボックスの位置や大きさの変更は一旦諦め、今の今まで放置しておりました。
そこから色々と経験し、改めて今週末に向き合ってた際……ホントに些細なきっかけで気付いたんですよ。自分のミスは「void Start」より上の宣言部分。
private BoxCollider hitBox;
にありました。
というのも、通らなかったときにはここの記述を
× private Collider hitBox;//※ダメなヤツ
にしていました。
なんでこんなミスが起こってるのに気付かなかったのかというと……
ここの部分が「Collider」表記だけでも、コンポーネント上では問題なく取れちゃうんですね。
でも、sizeやcenterの値は「BoxCollider」にある設定なので、当然Colliderとして習得してると「参照する場所がないよ」って言われるわけです。
教訓
SphereとかMeshでも同じ状況になると思うので
Collider表記「だけ」で宣言しないように!
……という反省回でした。
以前は解らなかった事に気付けるようになった分、成長はしてるんだと思います。思いたい。