質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.61%

  • Unity

    3827questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • Unity3D

    1249questions

    Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

コライダーが設定しづらい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 305

tkmnusr

score 161

 前提・実現したいこと

図のようにシーン上に配置しているとき、キャラクターは直立していて、
後ろの剣にコライダーを設置したいのですが、設置しにくい状況です。

イメージ説明

ゲームを再生すると、キーを押すことでモデルのポーズが変更できるのですが、
ゲーム再生中なので、この時にコライダーを設置しても意味ありません。

イメージ説明

このポーズをしている状態で、コライダーを設置する方法はありますか?
もしくは何か良い方法はありますか?
ご教示のほどよろしくお願いします。

 追記①

アセットは以下です。
現在ダウンロードできないかもしれません。
https://www.assetstore.unity3d.com/jp/#!/content/48768

 追記②

spine_2を調べたら、swordの下にswordcolliderというコライダーらしきゲームオブジェクトを見つけました。
しかし、インスペクタを表示してみると、コライダーがアタッチされていません。

イメージ説明

 追記③

樽アセットのスクリプト。

using UnityEngine;
using System.Collections;

public class crate : MonoBehaviour {
    public float hitpoints = 100f;
    public Transform spawnobject;
    public float radius = 3.0f;
    public float power = 100.0f;
    void Start () {

    }

    void Update () 
    {
        if (hitpoints <= 0)
        {
            Instantiate(spawnobject, transform.position, transform.rotation);
            Vector3 explosionPos = transform.position;
            Collider[] colliders = Physics.OverlapSphere(explosionPos, radius);
            foreach (Collider hit in colliders) 
            {
                if (hit.GetComponent<Rigidbody>() != null)
                {
                    Rigidbody rb = hit.GetComponent<Rigidbody>();
                    rb.AddExplosionForce(power, explosionPos, radius, 3.0f);

                }
            }
            Destroy (gameObject);
        }

    }
    void Damage (float damage) 
    {


        hitpoints = hitpoints - damage;
    }
}

 追記④

キャラクターにアタッチされているスクリプト。

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class simplecontroller : MonoBehaviour {


    public Transform mycamera;
    private Transform reference;

    public float jumpHeight = 2.0f;
    public float jumpinterval = 1.5f;
    private float nextjump = 1.2f;
    private float maxhitpoints = 1000f;
    private float hitpoints = 1000f;
    public float regen = 100f;

    public AudioClip[] hurtsounds;
    public AudioClip[] jumpsounds;
    public AudioClip[] attacksounds;


    public float gravity = 20.0f;
    public float rotatespeed = 4.0f;
    private float wantedrotatespeed;
    public float normalspeed = 4.0f;
    public float runspeed = 8.0f;

    public float dampTime = 2.0f;

    private bool isattack;


    public Transform target;
    private float moveAmount;
    public float smoothSpeed = 2.0f;

    private Vector3 forward = Vector3.forward;
    private Vector3 moveDirection = Vector3.zero;
    private Vector3 right;

    private float movespeed;
    public Vector3 localvelocity;

    public bool running = false;
    public bool canrun = true;

    AudioSource myaudiosource;

    Vector3 targetDirection = Vector3.zero;

    Vector3 targetVelocity;
    public GameObject impactprefab;
    public LayerMask mask;
    public float rayfiredelay = 0.35f;
    public float force = 1000f;
    public float damage = 50f;
    public Transform Deadprefab;
    Animator animator;
    CharacterController controller;
    Quaternion oldrotation;
    Quaternion currentrotation;

    public int attackanimcount;
    private int prevrandom = 0;
    private float randomattackfloat;
    public Transform shield;
    public Transform weapon;
    public Transform lefthandpos;
    public Transform righthandpos;
    public Transform chestposshield;
    public Transform chestposweapon;
    public AudioClip[] switchsounds;
    public AudioClip[] wooshsounds;

    private float addfloat = 0f;
    private bool fightmodus = false;
    private bool didselect;
    private bool canattack= false;

    void Awake ()
    {

        myaudiosource = GetComponent<AudioSource>();
        myaudiosource.loop = false;
        reference = new GameObject().transform;
        animator = GetComponent<Animator>();
        controller = GetComponent<CharacterController>();

    }


    void Start ()
    {
        Cursor.lockState = CursorLockMode.Locked;
    }

    void Update () 
    {

        reference.eulerAngles = new Vector3(0, mycamera.eulerAngles.y, 0);
        forward = reference.forward;
        right = new Vector3(forward.z, 0, -forward.x);
        float hor = Input.GetAxis("Horizontal") * 5f * Time.deltaTime;
        float ver = Input.GetAxis("Vertical") * 5f * Time.deltaTime;




        Vector3 velocity = controller.velocity;
        localvelocity = transform.InverseTransformDirection(velocity);

        bool ismovingforward =localvelocity.z > .5f;

        targetDirection = (hor * right) + (ver * forward);
        targetDirection = targetDirection.normalized;
        targetVelocity = targetDirection;



        if (fightmodus)
        {

            if (targetDirection == Vector3.zero) {
                Vector3 localTarget = transform.InverseTransformPoint (target.position);
                addfloat = (Mathf.Atan2 (localTarget.x, localTarget.z));
            } 
            else 
            {

                addfloat = 0f;
            }
            if (running)
            {
                if (targetDirection != Vector3.zero)
                {(省略)
                }
            } 
            else
            {(省略)
            }
        }
        else
        {
            addfloat = 0f;        
            lookweight = 0.1f;
            if (targetDirection != Vector3.zero)
            {
                var lookrotation2 = Quaternion.LookRotation(targetDirection,Vector3.up);
                lookrotation2.x = 0;
                lookrotation2.z = 0;
                transform.rotation = Quaternion.Lerp(transform.rotation,lookrotation2,Time.deltaTime * wantedrotatespeed);
            }

        }


        if (Input.GetButtonDown("Fire3") && Time.time > nextselect && canequip)
        {
            StartCoroutine (weaponselect ());
            nextselect = Time.time + 2f;
        }

        if (canattack && controller.isGrounded)
        {
            bool attackState = animator.GetCurrentAnimatorStateInfo(1).IsName("attacks");
            if (attackState) {
                canjump = false;
                //animator.applyRootMotion = true;
            } 
            else
            {
                canjump = true;
                //animator.applyRootMotion = false;
            }
            if (Input.GetButtonDown("Fire1"))
            {                
                if (!attackState) 
                {
                    StartCoroutine(raycastattack());
                    int randomattack = randomIntExcept (0, attackanimcount, prevrandom);

                    randomattackfloat = randomattack * 1.0f; 
                    animator.SetBool ("attack", true);
                    animator.SetFloat ("random", randomattackfloat);

                    int n = Random.Range (1, attacksounds.Length);
                    myaudiosource.clip = attacksounds [n];
                    myaudiosource.pitch = 0.9f + 0.1f * Random.value;
                    myaudiosource.Play ();
                    attacksounds [n] = attacksounds [0];
                    attacksounds [0] = myaudiosource.clip;
                    prevrandom = randomattack;
                }
            }
            else
            {
                animator.SetBool("attack",false);
            }
        }

        if (controller.isGrounded) 
        {
            canequip = true;
            lastspeed = Mathf.Lerp(lastspeed,speed,Time.deltaTime * 3f);
            if (Input.GetButton ("Jump") && canjump && Time.time > nextjump)
            { (省略)
                         }
        }

        else 
        {
            canequip = false;
            moveDirection.y -= (gravity) * Time.deltaTime;
            nextjump = Time.time + jumpinterval;
            animator.SetBool ("jump",false);    
        }

        if (Input.GetButton ("Fire2") && canrun && ismovingforward) 
        {
            speed = runspeed;
            running = true;
            wantedrotatespeed = rotatespeed;
        }
        else 
        {
            speed = normalspeed;
            running = false;
            wantedrotatespeed = rotatespeed;

        }
        targetVelocity *= lastspeed;
        moveDirection.z = targetVelocity.z;
        moveDirection.x = targetVelocity.x;

        animator.SetFloat("hor",((localvelocity.x/normalspeed) + addfloat), dampTime , 0.8f);
        animator.SetFloat("ver",((localvelocity.z/normalspeed)), dampTime , 0.8f);
        if (hitpoints <= 0)
        {
            //die
            Instantiate(Deadprefab, transform.position, transform.rotation);
            Destroy(gameObject);
        }

        animator.SetBool("grounded",controller.isGrounded);     
        controller.Move (moveDirection * Time.deltaTime);

        if (hitpoints < maxhitpoints)
            hitpoints += regen * Time.deltaTime;

    }
    void Damage (float damage) 
    {
        if (!myaudiosource.isPlaying && hitpoints >= 0)
        {
            int n = Random.Range(1,hurtsounds.Length);
            myaudiosource.clip = hurtsounds[n];
            myaudiosource.pitch = 0.9f + 0.1f *Random.value;
            myaudiosource.Play();
            hurtsounds[n] = hurtsounds[0];
            hurtsounds[0] = myaudiosource.clip;
        }
        //damaged = true;
        //myAudioSource.PlayOneShot(hurtsound);
        hitpoints = hitpoints - damage;
    }

    IEnumerator equip()
    {
      (省略)
    }
    IEnumerator raycastattack()
    {
        yield return new WaitForSeconds(rayfiredelay);
        Vector3 fwrd = mycamera.transform.forward;

        Vector3 camUp = mycamera.transform.up;
        Vector3 camRight = mycamera.transform.right;

        Vector3 wantedvector = fwrd;
        wantedvector += Random.Range( -.1f, .1f ) * camUp + Random.Range( -.1f, .1f ) * camRight;

        Ray ray = new Ray (transform.position + Vector3.up,wantedvector);
        RaycastHit hit = new RaycastHit();

        if (Physics.Raycast(ray,out hit, 3f,mask))
        {   

            if(hit.rigidbody) hit.rigidbody.AddForceAtPosition (force * fwrd , hit.point);
            hit.transform.SendMessageUpwards ("Damage",damage, SendMessageOptions.DontRequireReceiver);
            GameObject decal;

            decal = Instantiate(impactprefab, hit.point, Quaternion.FromToRotation(Vector3.up, hit.normal)) as GameObject ;
            decal.transform.localRotation = decal.transform.localRotation * Quaternion.Euler(0f,Random.Range(-90f,90f),0f);
        }


    }
    IEnumerator holster()
    {
        yield return new WaitForSeconds(.3f);
        shield.parent = chestposshield;
        shield.position = chestposshield.position;
        shield.rotation = chestposshield.rotation;

        int n = Random.Range(1,switchsounds.Length);
        myaudiosource.clip = switchsounds[n];
        myaudiosource.pitch = 0.9f + 0.1f *Random.value;
        myaudiosource.Play();
        switchsounds[n] = switchsounds[0];
        switchsounds[0] = myaudiosource.clip;


        weapon.parent = chestposweapon;
        weapon.position = chestposweapon.position;
        weapon.rotation = chestposweapon.rotation;


    }

}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • negitama

    2018/04/27 22:23

    このモデルって無料アセットですよね。もしそうであれば、参考情報としてアセットの情報を追記したほうが回答者とコミュニケーションしやすいかもしれませんね。商品の宣伝になってはまずいですが。

    キャンセル

  • tkmnusr

    2018/04/27 22:33

    ご指摘ありがとうございます。現在、ダウンロードできなさそうな状態なんですが、貼っておきます。https://www.assetstore.unity3d.com/jp/#!/content/48768

    キャンセル

  • negitama

    2018/04/27 22:42

    情報ありがとうございます。もとの質問内容のほうを更新して、追記したおいたほうがいいかも。現在ダウンロードできないという情報も含めて。

    キャンセル

回答 1

checkベストアンサー

0

質問者さんの挙げているアセットが現在入手できないようなので、取り急ぎ。

画像の2枚目のツリーのなかに、武器に関するボーンはありませんか?(Weapon、Sword、WeaponHolderなど)
もしあれば、そこにコライダーを追加して位置調整すればOKだと思います。

なければ、spine を展開すると右手のボーンが出てくると思うので、そこに空のゲームオブジェクトをぶら下げて(Weaponなどと名前を付ける)、それにコライダーをアタッチして試してみてください。

参考:
[Physics] 敵の武器に当たり判定を付ける [Unity] : ねぎたまらぼ(Unity, C#, VR)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/27 23:35

    ご回答ありがとうございます。
    空のゲームオブジェクトをぶら下げて、それにコライダーをアタッチする方法もあるのですね。
    調べてみたら、コライダーに関係しそうなオブジェクトを見つけました。
    追記しました。

    キャンセル

  • 2018/04/27 23:38

    SwordCollider という空のゲームオブジェクトがあるのなら、それにカプセルコライダーでもアタッチしてみて、動作確認してみてください。

    アニメーションさせてみて、コライダーが武器のモデルに追従しているようなら、コライダーの位置を微調整すればOKだと思います。

    キャンセル

  • 2018/04/28 02:34

    ご回答ありがとうございます。
    カプセルコライダーをアタッチして追従するようになりました。

    また、今頃気づいて申し訳ないのですが、このアセットで用意されている樽みたいなアセットに、剣の方はコライダー無しで、その剣を振り回して当ててみたら、樽が破壊されるアクションが実装されていました。
    剣の方にはコライダーがないはずなのに、樽にヒットして(動きとしてはすり抜けている)、剣が当たっていることを検知しているのはどうゆうカラクリなのかよくわかりませんが、おそらくスクリプトで衝突も検知できるのかもしれないと思いました。
    ご参考になるかはわかりませんが、樽のアセットにアタッチされていたスクリプトも貼っておきます。もしも、このスクリプトが衝突の検知に関係していたら、ご教示いただきたいです。

    キャンセル

  • 2018/04/28 02:58

    追記③の crate クラスには、「(樽が)ダメージを受ける」「樽のヒットポイントが0以下になったら爆発する」というような感じの処理しか書かれていないようです。

    ここからは推測ですが、樽ではなくて、このキャラクター側にアタッチされているスクリプト側で、swordcollider の位置にコライダー(を含むプレハブ)を生成する処理が書かれているのでしょうね。剣をしっかり振っているモーション中のある区間だけ、コライダーを有効にする、などの処理を行っているのかもしれません。

    キャンセル

  • 2018/04/30 03:28

    遅くなって申し訳ありません。
    どうしても気になってコライダー生成のスクリプトを探しているのですが、見つかりませんでした。
    キャラクターにアタッチしていたsimplecontrollerを追記しましたが(teratailの文字数制限上、そのクラスのコードを全て掲載できなかった為、攻撃とは関係なさそうなコードは省きました。)、
    このsimplecontrollerのraycastattack()というメソッドが、コライダーを生成せずに攻撃を実装しているコードなのかもしれないと思ったのですが、いかがでしょうか?

    キャンセル

  • 2018/04/30 11:47

    その箇所ですね。simplecontrollerのraycastattack()のなかで、樽にダメージを与える処理が行われています。ただしコライダーは生成していないようです(少なくとも追記4のコード内では)。代わりに、キャラクターの位置から指定の向きに最大長3のRay(光線)を飛ばして、そのRayが樽に当たったら、樽のスクリプト側のDamageメソッドを呼び出す、という処理になっているようですね。

    (掲題の質問から離れてきているので、この回答か次あたりで切り上げさせてもらいますね)

    キャンセル

  • 2018/04/30 11:55

    ご回答ありがとうございます。
    コライダーをアタッチしなくても、攻撃が実装できることがわかり勉強になりました。
    ご丁寧なご解説ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    Unityで、Lerpというものを使いたいのですがなにが間違っているのかわかりません。

    2つの操作キャラクターに一つのカメラをつける。 これをspeceボタンを押すことで切り替えるようにしたい。その時、Lerpというものを使いいきなり画面が変わるのではなく徐々に追従す

  • 受付中

    Unityでのナビゲーションラインの実装について

    unityでナビゲーションラインを実装したいと思っています。 画像中央の青いラインみたいなもの、プレイヤーから特定のオブジェクトに対して線を引き、方向を教える。 現在LineRe

  • 解決済

    [Unity] MoveTowardsAngle関数の回転

    MoveTowardsAngle関数で、x軸の回転(左の球)だけ90度地点で止まります。 右の球のような動きで、x軸に360度の回転をさせたいです。どうしたらいいですか?

  • 解決済

    Unity ヒンジ 角度 C#

    Unityの2Dヒンジ、または3Dヒンジで2つのオブジェクト間の角度をC#で取得、値を代入するにはどうすればよろしいのでしょうか?

  • 受付中

    カメラの操作用スクリプトについて

    unityでカメラをyを軸に回転させ、向いた方向を前として、wで前進、sで後進、aで左、dで右に動かすスクリプトを書きたいのですが、軸で回ることはできても、どうしてもワールドのx,

  • 受付中

    Unity C# でオブジェクトを移動させたい。

    前提・実現したいこと 今、Unityで横スクロール型の2Dゲームを作っています。 ゲームの内容は、Enterを押してゲームスタート、キャラクターがゴールまで自動で走り、 シフトを押

  • 解決済

    3Dゲームでバイオハザードと同じ様な操作を(自機に)したい。

    ・カメラの位置は自機の頭部の少し後ろ上に固定。 ・カメラのポジションはxとy軸のみ変更可能。 ・W,S,A,Dのそれぞれのキーで前進、後退、左移動、右移動。 上記の三点を行いた

  • 解決済

    Unityで回転制限をつけたいです。

    前提・実現したいこと 下記コードでAキー、Dキーを押している間それぞれY軸の-方向、Y軸の+方向に回転するよう書きましたが、90度回転したら回転できないようにする機能をつけたいです

同じタグがついた質問を見る

  • Unity

    3827questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • Unity3D

    1249questions

    Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。