質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

2107閲覧

unity imageの扱い方

miiichat

総合スコア72

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2017/06/12 01:59

###わからないこと

ダメージを受けるとHPの画像を少しずつ消すようにしました。
このようなエラーが出ます。
Assets/Image.cs(9,27):error CS1525: Unexpected symbol (, expecting ,
何か間違っているところはありますか?
回答いただけると嬉しいです。

using UnityEngine; using UnityEngine.UI; public class Image : MonoBehaviour { void show(int HP,int maxHP) { Image image = GetComponent<Image>(); image.fillAmount =float(HP/maxHP); } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

スクリプトの名前までImageにしているため、型の混乱が起きているんでしょうか?
Image image = GetComponent<Image>();UnityEngine.UI.Image image = GetComponent<UnityEngine.UI.Image>();などとすると、何か変化はあるでしょうか。

[追記]
いや、上記の場合だとunexpected symbolは出ないですよね...
どこか,を書くべきところに(があるということでしょうが、どこですかね?

[さらに追記]
たびたびすいません、エラー箇所ですが、型変換の書式の誤りかと思われます。float(HP/maxHP)(float)HP/maxHPでどうでしょう。

投稿2017/06/12 03:17

編集2017/06/12 03:36
Bongo

総合スコア10807

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miiichat

2017/06/12 14:57

回答ありがとうございます! classnameをImageからImageHPに変えて、float(HP/maxHP)を(float)HP/maxHPにしたところエラーが変わりました。 アクセスできてないみたいです。 ・Assets/enemyScript.cs(17,12): error CS0122: `ImageHP.show(int, int)' is inaccessible due to its protection level <enemy.cs> using System.Collections; using System.Collections.Generic; using UnityEngine; using System; using UnityEngine.SceneManagement; using UnityEngine.UI; public class enemyScript : MonoBehaviour { private int maxHP = 100; private int HP = 100; private void OnCollisionEnter(Collision col) { if (col.gameObject.CompareTag ("Player")) { HP = Math.Max(HP--, 0); ImageHP.show(HP,maxHP); } } } <ImageHP> using UnityEngine; using UnityEngine.UI; public class ImageHP : MonoBehaviour { void show(int HP,int maxHP) { Image image = GetComponent<Image>(); image.fillAmount =(float)HP/maxHP; } }
Bongo

2017/06/12 15:15 編集

showメソッドがpublicでないことが原因かと思います(アクセス修飾子なしでは自動的にprivate)。 private指定されたものはImageHPの外(enemyScript)からは呼び出せなくなります。 宣言を「public void show(int HP,int maxHP)」に変えてみるとどうでしょうか。 参考: https://ja.stackoverflow.com/questions/20878/c%E3%81%AEclass%E3%81%A7%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97%E3%81%8C%E6%98%8E%E8%A8%98%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6 [追記] おそらく上記を修正しても、今度はまた別のエラーが出る恐れがありますが... もし問題なく動くようならけっこうです。
miiichat

2017/06/12 23:39

public static void show(int x, int y) { Image image = GetComponent<Image>(); image.fillAmount =(float)x/y; } とすると、 ・An object reference is required to access non-static member `UnityEngine.Component.GetComponent<UnityEngine.UI.Image>()' とでました。
Bongo

2017/06/13 00:31 編集

でしょうね...次の修正箇所は呼び出す側、ImageHP.show(HP,maxHP);になります。 showはインスタンスメソッドであるのに対し、ImageHP.show(HP,maxHP);は静的メソッド(宣言にstaticが付いた、特定のインスタンスとは紐付けられていないメソッド)を呼ぶときの書き方です。 ImageHPのインスタンス、つまりアタッチされているImageHPコンポーネントを取得し、それに対してshowを呼ぶように変更してみてください。 例えば、GetComponent<ImageHP>().show(HP,maxHP);などにしてみるとどうでしょう。 なお、これはenemyScriptとImageHPがどちらも同じオブジェクト(多分敵キャラクターのオブジェクト?)にアタッチされていることを前提としていますので、そうでない場合はさらに修正が必要かと思います。 参考: http://hiroyukitsuda.com/archives/1702 [追記] すいません、showをstaticに書き換えていますね。showのstaticを削除して、インスタンスメソッドに戻してから試してみてください。
miiichat

2017/06/13 02:19

enemyScriptとImageHPが別々のオブジェクトについているので、 GameObject.Find("Image").GetComponent<ImageHP>().show(HP,maxHP); としてみたところエラーが消えました! でも、ぶつかってもHPが変動しません・・
Bongo

2017/06/13 02:54

ImageHPを付けているオブジェクトは、シーンの中に一つだけでしょうか?もし、例えば敵キャラクターの数だけ複数存在していると、最初のGameObject.Find("Image")で別の敵用のImageオブジェクトが持ってこられているために正しく動かないのかもしれません。 もう一点確認しますが、ImageHPのオブジェクトのImageのImage TypeはFilledになっているでしょうか?
miiichat

2017/06/13 03:52

ImageHPを付けているオブジェクトは、シーンの中に一つだけです。 Image TypeはFilledです。
Bongo

2017/06/13 04:48 編集

一つ怪しいところがありました。HP = Math.Max(HP--, 0);をHP = Math.Max(HP - 1, 0);に変えてみるとどうでしょう。 ポストデクリメント(変数の後に--)は変数の値を1減らすとともに、減らす前の値を返すため、いつまでたってもHPが減らないのかもしれません。 ちなみに、一つの式の中で変数の値を複数回書き換える(変数をデクリメントして、その結果をその変数自身に代入するような)のは、Cなどの言語では未定義動作に引っかかる禁じ手になる場合があります(今回はMaxメソッドを挟んでいるので、仮にCとしても大丈夫?)。C#では一応正当?らしいことを書いているサイトもありましたが、変数の書き換えは一つの式で一回までにした方が無難そうですね。
miiichat

2017/06/13 11:43

出来ました! 何度も返信くださって本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問