追記

```

    void awake (){
        monstar = Getcomponent<monstarstatus>(); //外部から
        monstar2 = Getcomponent<monstar2status> ();//外部から
        int monstarability = monstar.attack;
        int monstar2ability = monstar2.attack;
    
        int monstarHP = monstar.HP();
        int monstar2HP = monstar2.HP();
    
```

条件 monstarHPかつmonstar2HPの数値が>0の場合  
monstarが先に行動するとして、

```

    int monstar2LEFTHP = (monstar2HP -= monstarability);
    int monstarLEFTHP = (monstarHP -= monstar2ability);
    
```

上記の動作を永続的に行う。なお、どちらかのLEFTHPが<0になった場合その場で終了する

これはif と forを使うのでしょうか？ または、ほかの方法を求みます。

```

    int monstarLEFTHP = monstarHP - damage;// モンスターLEFTHP = モンスターHP100- damage 20 
    
```

この繰り返しの処理をする場合  
LEFTHP100ではなく、80になっているので  
次は80から-20を引きたい。
CC BY-SA 3.0
2015-06-25T12:16:43.163
11729
2015-07-26T01:00:20.100
2015-06-26T00:02:54.647
440
9268
question
c#
変数の引渡し方法についてc　#
だいたい以下の様にしているかと思います。

```

    using System;
    
    public class Monster {
        private int hp = 100;
    
        public int HP(){
            return hp;
        }
    }
    class Sample{
        static void Main(){
            Monster monster = new Monster();
            int hp = monster.HP();//モンスターの現在のHPを取り出す
            int damage = 20;
            while(hp > 0){
                Console.WriteLine("モンスターの現在のHPは{0}です。", hp);
                hp -= damage;//ダメージの計算
                Console.WriteLine("ダメージを受けてHPは{0}になりました。", hp);
            }
        }
    }
    
```

値をメソッド(`monster.HP()`)で取り出していることから  
外部のメソッドで実行していると思いますが、  
HPは`monster`の属性値ですから書き戻す必要があります。  
例えば以下の様に属性値をセットするメソッドを追加します。

```

    using System;
    
    public class Monster {
        private int hp = 100;
    
        public int HP(){
            return hp;
        }
        public void HP(int value){
            hp = value;
        }
    }
    class Sample{
        static void Main(){
            Monster monster = new Monster();
            int hp;
            int damage = 20;
            do {
                hp = monster.HP();//読み出し
                Console.WriteLine("モンスターの現在のHPは{0}です。", hp);
                hp -= damage;
                monster.HP(hp);//書き出し
                Console.WriteLine("ダメージを受けてHPは{0}になりました。", hp);
            } while(hp > 0);
        }
    }
    
```

こうすると、モンスターの値を取り出し、ダメージの計算をして、書き戻すというループにできます。

Ｃ＃では、こういう属性値でprivateにしておいて直接値を扱わせたくない（のでメソッド経由でやりとりする）ような場合にプロパティとしての構文があります。  
プロパティを使って同じように書くと以下の様になります。

```

    using System;
    
    public class Monster {
        private int hp = 100;
    
        public int HP{
            get {
                return hp;
            }
            set {
                if(value < 0){
                    hp = 0;
                } else {
                    hp = value;
                }
            }
        }
    }
    class Sample{
        static void Main(){
            Monster monster = new Monster();
            int hp;
            int damage = 20;
            do {
                hp = monster.HP;
                Console.WriteLine("モンスターの現在のHPは{0}です。", hp);
                hp -= damage;
                monster.HP = hp;
                Console.WriteLine("ダメージを受けてHPは{0}になりました。", hp);
            } while(hp > 0);
        }
    }
    
```

外部からは直接属性値を扱っているように見えるので、単純に以下の様に書けます。

```

    Monster monster = new Monster();
    int damage = 20;
    do {
        Console.WriteLine("モンスターの現在のHPは{0}です。", monster.HP);
        monster.HP -= damage;
        Console.WriteLine("ダメージを受けてHPは{0}になりました。", monster.HP);
    } while(monster.HP > 0);
    
```

個人的にはこういうのを外部でやるより  
`monster.damage(damege);`  
のような呼び出しでやる方がいいような気がします。
CC BY-SA 3.0
2015-06-25T22:13:01.983
11741
2015-06-25T22:13:01.983
5044
11729
answer