回答編集履歴
2
伸縮をなめらかにするよう変更
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
コメントに対して追記
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
|
+
```
|