2016-04-10 3 views
1

私は、スクリプトを動作させるために必要なオブジェクトの位置をオブジェクトとして持つC#でコードを記述しようとしています。私はそれが私が使用されていたと思っているものとしてポインタを使用しようとしていた。それは私が何か間違っていると思うようになった安全でないタグを使用しなければならないと言いました。私は少しこれの新しいですが、これまで私はC + +で私の知識のほとんどを持っているので、私はクラスで学んだことです。私はそれを見てみましたが、私はそれを見つけることができませんでした。これは基本的に私が今持っているものです。C#で別の変数の値を取得するには

using UnityEngine; 
using System.Collections; 

public class SGravSim : MonoBehaviour { 

public GameObject moon; 
public GameObject earth; 

private struct Cords 
{ 
    public float* x 
    { 
     get 
     { 
      return x; 
     } 
     set 
     { 
      if (value != 0) <== this thing is realy just a placeholder 
       x = value; 
     } 
    } 
    public float* y 
    { 
     get 
     { 
      return y; 
     } 
     set 
     { 
      if (value != 0) <== this this is only in here for now 
       y = value; 
     } 
    } 
    public void DisplayX() 
    { 

    } 
} 
private Cords moonLocation; 
private Cords earthLocation; 
private Cords SataliteLocation; 

// Use this for initialization 
void Start() { 
    moonLocation.x = moon.transform.position.x;   
    moonLocation.y = moon.transform.position.y; 
    earthLocation.x = earth.transform.position.x; 
    earthLocation.y = earth.transform.position.y; 
    SataliteLocation.x = this.transform.position.x; 
    SataliteLocation.y = this.transform.position.y; 
} 

// Update is called once per frame 
void Update() { 

    Debug.Log(moon.transform.position.x); 
    // 
    // Summary: 
    //  The position of the transform in world space. 

    float yMoon = moon.transform.position.x 
    print(moonLocation.y); 

} 
} 

私はあなたが何も追加できないようにすることを計画していました。 私は地球全体を書くことができると思う。私がそれを使う必要があるたびに、私はちょうどそこにもっと良い方法があるかどうか、また変数としてすべてを私はそれを読むことをしたいです。

+0

私は本当にここであなたの問題を把握できませんでした。私が気づいたいくつかの事があります:1 - 値の代わりに参照を使用する必要がある場合は、構造体ではなくクラスを使用する必要があります。ポインタの必要はありません。 setterに定義させたくない場合は、デフォルトのコンストラクターを変更して値を受け入れることができます。 – Gubr

+0

'get'で読み込みアクセスが必要な場合は、単に' set'を省略してください。 – khlr

+0

あなたが解決したいことを説明してください、未知の問題に対する潜在的な解決策についての質問を理解するのを難しくしているので、質問は今立つと非常に不明です。代わりにその問題について質問してください。あなたが解決しようとしている最も重要な問題は何ですか? –

答えて

0

あなたは本当に以外のC#でポインタを使うべきではありません特定のケース。いくつかの人々がここであなたを与えた ソリューションは良いです:

public float X {get; private set;} 

これは、プロパティと呼ばれ、ゲッターとセッターを作成しないようにするのC#での素敵な可能性の一つです。

あなたはC++で知識があると言いますが、C#は実際にはjavaなどの上位言語に近いものです。オブジェクト指向の方法で、特にUnityを使用して、低レベルのポインタをコード化して忘れることに焦点を当てるべきです。

0

あなたは使用することができます。

private float x; 
 
public float X 
 
{ 
 
    get 
 
    { 
 
     return x; 
 
    } 
 
}
は今、あなたは、あなたのクラス内からのxを設定します。

1

あなたは自動プロパティでプライベートセットを使用することができます。

public float X {get; private set;} 

この方法でのみ、自分のクラス変数を設定することができるようになりますが、他のクラスではないだろう。

0

実際に安全でないポインタを使用しようとすると、安全でないタグの警告が表示されます。そのためのユースケースがあるかもしれませんが、C#では一般的にreference typesと値型を使用します。 C#では構造体が値型なので、参照型と比較して異なる動作をします。hereを読むことができます.Gubrが構造体の代わりにクラスを使用することも示唆されています。最後は重要なことですが、保存方法に違いがあります。ちょうどGoogle C#のヒープとスタックです。

私は構造体をC#でまだ使用していないので、私はちょうど新しいプロジェクトを作成し、ちょっとしたことをしました。他の人が述べたように、あなたがセットを残したり、それをプライベートにして、コンストラクタを追加することができ

private struct Cords 
    { 
     public float x, y; 
     public void DisplayX(){} 
    } 

だから私もちょうどこのようになりますあなたのコードを、使用していました。プライベートセットは、自動プロパティでそれを定義していないとは限りません。代わりに、読み取り専用フィールドが作成されます。ただし、値を設定するには、両方のケースでnew演算子を呼び出す必要があり:

private struct Cords 
    { 
     public float X { get; } 

     public float Y { get; } 

     public void DisplayX(){} 

     public Cords(float x, float y) 
     { 
      X = x; 
      Y = y; 
     } 
    } 

をそしてここで私たちは、新しいコードを作成します。

Cords earth = new Cords(10.005f, 12.689f); 
関連する問題