-3

私のゲームは2DRTSであり、Unityの優れたチュートリアルを誰かが知っているのか、それとも構文に精通している人が私が間違ったことを教えてくれるのだろうかと思っていました。

つまり、カメラオブジェクトとプレーヤーオブジェクトの両方にタグが付けられています。プレーヤーオブジェクトにはスプライトがあり、rigidbodyに設定されています。スクリプトは次のようになります。

using UnityEngine;
using System.Collections;

public class AIsciript : MonoBehaviour
{
private bool thisIsPlayer = true;
private GameObject objPlayer;
private GameObject objCamera;

//input variables (variables used to process and handle input)
private Vector3 inputRotation;
private Vector3 inputMovement;

//identity variables (variables specific to the game object)
public float moveSpeed = 100f;

// calculation variables (variables used for calculation)
private Vector3 tempVector;
private Vector3 tempVector2;

// Use this for initialization
void Start()
{
    objPlayer = (GameObject)GameObject.FindWithTag("Player");
    objCamera = (GameObject)GameObject.FindWithTag("MainCamera");
    if (gameObject.tag == "Player")
    {
        thisIsPlayer = true;
    }
}

// Update is called once per frame
void Update()
{
    FindInput();
    ProcessMovement();
    if (thisIsPlayer == true)
    {
        HandleCamera();
    }
}

void FindInput()
{
    if (thisIsPlayer == true)
    {
        FindPlayerInput();
    }
    else
    {
        FindAIInput();
    }
}
void FindPlayerInput()
{
    //find vector to move
    inputMovement = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));

    //find vector to the mouse
    tempVector2 = new Vector3(Screen.width * 0.5f, 0, Screen.height * 0.5f);

    // the position of the middle of the screen
    tempVector = Input.mousePosition;

    // find the position of the mouse on screen
    tempVector.z = tempVector.y;

    tempVector.y = 0;
    Debug.Log(tempVector);
    inputRotation = tempVector - tempVector2;
}
void FindAIInput()
{

}
void ProcessMovement()
{
    rigidbody.AddForce(inputMovement.normalized * moveSpeed * Time.deltaTime);
    objPlayer.transform.rotation = Quaternion.LookRotation(inputRotation);
    objPlayer.transform.eulerAngles = new Vector3(0, transform.eulerAngles.y + 180, 0);
    objPlayer.transform.position = new Vector3(transform.position.x, 0, transform.position.z);
}
void HandleCamera()
{
    objCamera.transform.position = new Vector3(transform.position.x, 15, transform.position.z);
    objCamera.transform.eulerAngles = new Vector3(90, 0, 0);
}
}

念のためコードを投稿するつもりでしたが、強制的に移動させようとしてStart()何も起こらなかったので、おそらく問題ではないと思います。

4

2 に答える 2

2

thisIsPlayerに対してこれらすべてのチェックを使用するべきではありません。プレイヤーエンティティとノンプレイヤーエンティティに別々のクラスが必要です。

パブリック変数はエディターで公開され、レベルが保存されるときにエンティティとともにシリアル化されます。これは、moveSpeedが現在このクラスで初期化されているものに設定されていないことを意味している可能性があります。

Updateメソッドでリジッドボディに力を追加しないでください。物理演算を適用するために使用されるFixedUpdateメソッドがあります。これは、フレームレートに関係なく、Updateがフレームごとに1回呼び出され、FixedUpdateが特定の間隔でのみ呼び出されるため、物理的な力がフレームレートの影響を受けないためです。

また、力を加えて同じオブジェクトの変換の位置を設定しようとしないでください。奇妙なことが起こります。

Unity Asset Store(Unityの[ウィンドウ]メニューで利用可能)にアクセスすると、「プロジェクトの完了」というセクションがあり、無料のチュートリアルがいくつか含まれています。どれがC#で書かれているのか思い出せませんが、JavaScriptのものでも、プロジェクトの構造についていくつかのアイデアが得られます。

于 2011-03-02T05:16:49.887 に答える
0

私がそれを正しく理解したかどうかはわかりません:あなたの問題は、それがAIによって動かされないということですか?

もしそうなら、1つの問題はあなたがあなたの初期化することである可能性があります

private bool thisIsPlayer = true;

trueであるが、falseに設定されている条件が表示されない(aiモードに入る)

ちょうど私の2セント:)

于 2011-03-03T12:04:06.360 に答える