2017-09-01 2 views
0

私は最初のFPSゲームを開発しています。私は今まで何をしてきたのか、私が問題を解決しようとしたことを説明しようとします。弾丸プレハブは与えられた目標には行きません

プレーヤーを制御するFPSコントローラがあり、プレーヤーに武器が取り付けられています。武器ゲームオブジェクトには、ButtetSpownという子オブジェクトがあります。私は平地を地面に使用し、いくつかの立方体を壁として追加しました。それが私の基本的なセットアップです。私はレイキャスティングで目標位置を収集しています。

Vector3 rayOrigin = fpsCam.ViewportToWorldPoint(new Vector3(0.5f, 0.5f, 0.0f)); 

ここでは、インスタンス化された箇条書きを示します。以下は私のインスタンス化のプロセスコードです(私は銃のアニメーションコードを削除しました)

void Update() { 

     Vector3 rayOrigin = fpsCam.ViewportToWorldPoint(new Vector3(0.5f, 0.5f, 0.0f)); 
     //Debug.DrawRay(rayOrigin, fpsCam.transform.forward * weaponRange, Color.green); 

     if (Input.GetMouseButton(0) && Time.time > NextFire) 
     { 
      NextFire = Time.time+ FireRate; 

      if (Physics.Raycast(rayOrigin, fpsCam.transform.forward, out hit, weaponRange)) 
      { 

       bulletclone = Instantiate(Bullet.transform, SpownPoint.transform.position, SpownPoint.transform.rotation) as Transform; 
       bullet bulletScript = bulletclone.GetComponent<bullet>(); 
       bulletScript.target = hit; 
       Debug.Log("hit " + hit.point); 

       bulletScript.Accuracy = Accuracy; 

       if (hit.rigidbody != null) 
       { 
        hit.rigidbody.AddForce(-hit.normal * 100); 

       } 
      } 

      StartCoroutine(Firing()); 

     } 
} 

箇条書きのスクリプトの更新方法です。弾丸には剛体の付着があり、等速筋は真です。

Vector3 targetPosition=new Vector3(target.point.x + Random.Range(-Accuracy*2, Accuracy*2), target.point.y + Random.Range(-Accuracy/2, Accuracy/2), target.point.z); 

Debug.Log("Target " + targetPosition); 
rb.velocity = (targetPosition- transform.position).normalized * speed; 

これはうまくいきます:弾丸はターゲットを正しく取得します。問題は、PoolManagerを追加してプレハブを制御した後に発生します。私はPoolManagerスクリプトを書いた。 PoolManagerスクリプトはPoolManagerのゲームオブジェクトに添付されています。

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 

public class PoolManager : MonoBehaviour { 

    [Tooltip("Maximum size of a gameobject can be in the pool")] 
    public int MaxPoolSize = 20; 
    public bool CanGrow = true; 
    public GameObject[] PoolItems; 
    public int[] ItemSize; 
    private GameObject[] ActiveList; 

    private Dictionary<string, int> Pooled = new Dictionary<string,int>(); 

    void Start() { 
     //Add default prefabs as child of PoolManager gameobject 
     for (int i = 0; i < PoolItems.Length; i++) 
     { 

      Pooled.Add(PoolItems[i].name ,0); 
      for (int s = 0; s < ItemSize[i]; s++) 
      { 
       GameObject g = Instantiate(PoolItems[i]); 
       g.name = PoolItems[i].name; 
       g.transform.parent = transform; 
       g.SetActive(false); 
       Pooled[g.name]=s + 1; 
      } 
     } 

    } 


    public Transform InstantiateObject(int ItemIndex, Vector3 Position, Quaternion Rotation) 
    { 
     Transform test = TryActive(ItemIndex, Position, Rotation); 
     if (CanGrow == true && test == null) 
     { 

      if (Pooled[PoolItems[ItemIndex].name] < MaxPoolSize) 
      { 
       GameObject g = Instantiate(PoolItems[ItemIndex]); 
       g.name = PoolItems[ItemIndex].name; 
       g.transform.parent = transform; 
       Pooled[g.name] = Pooled[g.name] + 1; 
       return TryActive(ItemIndex, Position, Quaternion.identity); 
      } 


     } 
     return test; 
    } 

    Transform TryActive(int ItemIndex, Vector3 Position, Quaternion Rotation) 
    { 
     if(PoolItems.Length==0) return null; 

     int children = transform.childCount; 
     for (int i = 0; i < children; ++i) 
     { 
      if (transform.GetChild(i).name == PoolItems[ItemIndex].name) 
      { 
       if (transform.GetChild(i).gameObject.activeInHierarchy == false) 
       { 
        transform.GetChild(i).gameObject.SetActive(true); 
        transform.GetChild(i).position = Position; 
        transform.GetChild(i).rotation = Rotation; 
        return PoolItems[ItemIndex].transform; 
       } 
      } 
     } 


    } 

} 

だから、すべてのインスタンス化プレハブがPoolManagerのゲームオブジェクトの子として追加されます

PoolManager.cs。

は、その後、私は以下のように私の銃スクリプト更新機能を変更:ここで

if (Physics.Raycast(rayOrigin, fpsCam.transform.forward, out hit, weaponRange)) 
    { 
      //1st parameter 0 is my bullet prefab which in PoolManager (PoolItems). 
      // Only this code has changed from previous version 

        bulletclone = poolmanager.InstantiateObject(0, SpownPoint.transform.position , SpownPoint.transform.rotation); 

        bullet bulletScript = bulletclone.GetComponent<bullet>(); 
        bulletScript.target = hit; 
        Debug.Log("hit " + hit.point); 

        bulletScript.Accuracy = Accuracy; 



        if (hit.rigidbody != null) 
        { 
         hit.rigidbody.AddForce(-hit.normal * 100); 

        } 
    } 

は問題です:箇条書きは、正しくSpownPointに活性化したが、弾丸は実際のターゲットになりません。それは常にPlain(地面)の(0,0,0)点に向かいます。弾丸のtargetPositionとヒットポイント位置をデバッグして、レイのヒットポイントと弾丸のターゲット位置を確認しました。

Debug.Log("hit " + hit.point); 

Debug.Log("Target " + targetPosition); 

私がここで間違っていることを誰にも見せてもらえますか?私は何を変えるべきですか?

+0

return PoolItems[ItemIndex].transform; 

から変更すべきですか? – ZayedUpal

+0

速度は500です。速度はOKです –

+0

ベクトル3の目標位置は(0,0,0)になります理由はわかりません –

答えて

0

問題がPoolManagerスクリプトで見つかりました。 TryActiveメソッドのreturn文は、万が一**高速**弾丸の0は、あなたがオブジェクトプールを使用していることであれば確認しました

return transform.GetChild(i).transform; 
関連する問題