2017-09-17 4 views
-4

私は比較的新しいC#です。私は、スクリプトの次の抜粋がありますここで連鎖がうまくいかないため、中間変数を設定する必要がありますか?

public class Flipper : MonoBehavior { 
    HingeJoint hinge; 
    void start() { 
    hinge = GetComponent<HingeJoint>(); 
    hinge.limits.min = 0; 
    } 
} 

ラインhinge.limits.min = 0を。コンパイルされません。代わりに、次のような中間変数を割り当てて2段階で行う必要があります。

JointLimits limits = hinge.limits; 
limits.min = 0 

これはなぜですか?

+0

'HingeJoint'は' min'プロパティを実装しません。 'JointLimits'はそうです。 –

+0

オブジェクトを 'HingeJoint'から' JointLimits'に暗黙的にキャストしています。 https://stackoverflow.com/questions/1339482/typecasting-in-c-sharpも参照してください。 –

答えて

3

は、これには2つの理由があります。 JointLimitsは構造体です。

JointLimitsは、自動プロパティ変数として宣言されています。

HingeJoint.limitsstructと自動プロパティ({ get; set; })として宣言されているJointLimitsのタイプであるので、あなたは直接の内側にある変数(min)を変更することはできません。 structのコピーを作成し、その中の変数を変更してから、構造体をHingeJointに割り当てます。 structと制限変数を宣言するautoプロパティを使用する理由は、それができない理由です。

public JointLimits limits { get; set; } 

transform.positionにも同じことが当てはまります。位置がstructあるVector3の一種であり、それはまた、自動プロパティとして宣言されているので、あなたは、直接そのXYZ変数を変更することはできません。

public Vector3 position { get; set; } 

あなたがする必要があります最初にコピーを作成してから変更し、transform.positionに割り当てます。

コード内の別の無関係な問題は、Start関数です。 Startではなくstartです。

HingeJoint hinge; 

void Start() 
{ 
    hinge = GetComponent<HingeJoint>(); 

    //Make Limit copy 
    JointLimits limits = hinge.limits; 

    //Modify limit variable 
    limits.min = 0; 

    //Assign back to HingeJoint 
    hinge.limits = limits; 
} 
関連する問題