回答編集履歴

2

伸縮をなめらかにするよう変更

2018/09/15 07:10

投稿

Bongo
Bongo

スコア10807

test CHANGED
@@ -64,7 +64,7 @@
64
64
 
65
65
  // プロパティを追加して、それを参照するのが常套手段かと思います
66
66
 
67
- m_HPimage.fillAmount = m_PlayerScript.HP / 100.0f;
67
+ m_HPimage.fillAmount += ((m_PlayerScript.HP / 100.0f) - m_HPimage.fillAmount) * 0.1f;
68
68
 
69
69
 
70
70
 

1

コメントに対して追記

2018/09/15 07:09

投稿

Bongo
Bongo

スコア10807

test CHANGED
@@ -9,3 +9,115 @@
9
9
  次に、その下の行の`m_PlayerScript = m_PlayerScript.GetComponent<PlayerMove>();`は`m_PlayerScript = m_Player.GetComponent<PlayerMove>();`の打ち間違いでしょうか。
10
10
 
11
11
  ここを修正すれば`m_Player`から`PlayerMove`スクリプトコンポーネントが取得され、`m_PlayerScript`にちゃんと代入されるようになるかと思います。
12
+
13
+
14
+
15
+ ### 追記
16
+
17
+ 固まってしまう原因は、高確率で`Update`内の`while`ブロック部分でしょうね...
18
+
19
+
20
+
21
+ Unityのスクリプトは、特殊なことをしない限りシングルスレッドで動作するはずです。たとえばシーン内にA、B、Cの3つのスクリプトがあったとすると、こういうイメージよりも...
22
+
23
+ ![並列](0e5bc0a08b48b97263ea96662572ba62.png)
24
+
25
+ こういうイメージの方が実際の動作に近いでしょう。
26
+
27
+ ![直列](ac7d6f68e07ab632a112175db2662802.png)
28
+
29
+ 一つのスレッドで各メソッドが順番に実行されるので、どこかで不用意に無限ループを使ってしまうと、全体が応答不能になってしまうと思われます。
30
+
31
+
32
+
33
+ ご提示のコード中の`while`ループは消してしまってもよさそうです。こんな感じではいかがでしょうか?
34
+
35
+
36
+
37
+ ```C#
38
+
39
+ // Update is called once per frame
40
+
41
+ void Update()
42
+
43
+ {
44
+
45
+ if (m_PlayerScript.HP <= 0)
46
+
47
+ {
48
+
49
+ m_HPimage.fillAmount = 0;
50
+
51
+ }
52
+
53
+ else
54
+
55
+ {
56
+
57
+ // m_HPimage.fillAmount -= 1.0f / m_PlayerScript.HP;
58
+
59
+ // お節介かもしれませんが、HPゲージらしい伸縮をさせるなら、伸縮率を「現在HP / 最大HP」に
60
+
61
+ // 設定すればそれっぽくなるのではないでしょうか?
62
+
63
+ // 最大HPも、本当ならHpGaugeのコード中に直接書き込むよりも、PlayerMoveあたりに
64
+
65
+ // プロパティを追加して、それを参照するのが常套手段かと思います
66
+
67
+ m_HPimage.fillAmount = m_PlayerScript.HP / 100.0f;
68
+
69
+
70
+
71
+ if (m_PlayerScript.HP <= 10)
72
+
73
+ {
74
+
75
+ // 10以下になったら点滅する
76
+
77
+ Flashing(m_HPimage.color);
78
+
79
+ }
80
+
81
+
82
+
83
+ // まさか上記Flashingメソッドにも無限ループが入っていたりはしないでしょうか?
84
+
85
+ // このままでうまく動けば問題ないですが、さもなくばここも代替手段を
86
+
87
+ // 用意する必要があるでしょう
88
+
89
+ // 一案として、時刻をもとに色を決定するようにしてみました
90
+
91
+ /*
92
+
93
+ if (m_PlayerScript.HP <= 10)
94
+
95
+ {
96
+
97
+ // 1秒周期で0.0~1.0を繰り返す
98
+
99
+ var blendingRatio = (Mathf.Sin(Time.time * 2.0f * Mathf.PI) * 0.5f) + 0.5f;
100
+
101
+ // 時刻に応じたブレンド比で白と赤を混ぜ、それを乗算色とする
102
+
103
+ m_HPimage.color = Color.Lerp(Color.white, Color.red, blendingRatio);
104
+
105
+ }
106
+
107
+ else
108
+
109
+ {
110
+
111
+ // HPが回復したら平常時の色に戻す
112
+
113
+ m_HPimage.color = Color.white;
114
+
115
+ }
116
+
117
+ */
118
+
119
+ }
120
+
121
+ }
122
+
123
+ ```