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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Q&A

解決済

2回答

677閲覧

【Unity】オブジェクトの移動速度と透明度を対応させたい

Hinomae

総合スコア7

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

0グッド

0クリップ

投稿2022/08/04 05:35

編集2022/08/04 06:12

前提

Unity 3Dで、オブジェクトの移動速度の値に応じてアタッチしたMaterialの透明度を変化させるプログラムを実装しようとしています。

どうしてもエラーメッセージが出てしまい上手くいかないので知恵をお借りしたいです。

発生している問題・エラーメッセージ

Assets\Scripts\ChangeTransparency.cs(48,57): error CS1503: Argument 4: cannot convert from 'byte[]' to 'byte'

該当のソースコード

C#

1using System; 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5 6public class ChangeTransparency : MonoBehaviour 7{ 8 //オブジェクトの直前の位置を格納する変数 9 private Vector3 _prevPosition; 10 11 private MeshRenderer _mesh; 12 13 void Start(){ 14 //直前の位置を取得 15 _prevPosition = transform.position; 16 } 17 18 void Update(){ 19 20 //Time.deltaTimeが0に近似していれば何もしない 21 if(Mathf.Approximately(Time.deltaTime, 0)) 22 return; 23 24 //現在位置を取得 25 var position = transform.position; 26 27 //速度を計算 28 var velocity = (position - _prevPosition) / Time.deltaTime; 29 30 //xyz方向のうち最大の速さを取得 31 float MaxVel = Mathf.Max(Mathf.Abs(velocity.x), Mathf.Abs(velocity.y), Mathf.Abs(velocity.z)); 32 33 //透明度を変更 34 ChangeTransparency(MaxVel); 35 36 print($"velocity = {velocity}"); 37 38 //直前の位置を現在位置に更新 39 _prevPosition = position; 40 } 41 42 void ChangeTransparency(float vel){ 43 44 //速さが30.0以上なら完全に透明 45 if(vel > 30.0){ 46 _mesh.material.color = new Color32(0, 0, 0, 0); 47 } 48 49 //速さ30.0未満 50 else{ 51 52 //速度の値を0~1に正規化 53 var alpha = vel / 30.0; 54 55 //透明度をalphaの値で変化 [[質問したい点]] 56 _mesh.material.color = new Color32(0, 0, 0, BitConverter.GetBytes(alpha)); 57 } 58 }

試したこと

UnityEngine.Color32構造体の中身はbyte型なので、float型のalphaをbyte型に型変換して…という方向に持って行きたかったのが上のコードです。
しかしGetBytesメソッドだとbyte[]型に変換されてしまうため別のやり方を模索しています。

byte[]型からbyte型に変換する手法も調べましたが、これといったものは見つかりませんでした。

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

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

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

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

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

guest

回答2

0

_mesh.material.colorはColor型であってColor32じゃないですよ。

投稿2022/08/04 09:26

drednote

総合スコア336

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

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

drednote

2022/08/04 09:35

失礼。変換対応してるね。 BitConverter.GetBytes(alpha));の方ですね。 GetBytesの戻り値がbyte[]だから、ですね。 (byte)(alpha*255)、でどうでしょう?
Hinomae

2022/08/05 02:16

記述を試してみたところエラーが無くなりました!ありがとうございます。 ベストアンサーと同じくらい役に立ったのですが、解答の早さという意味でもう1方の答えにさせていただきます。ご了承ください。
guest

0

ベストアンサー

0~1にするのではなく0~255の整数(byte型に入る値)に変換しましょう。

投稿2022/08/04 07:04

YAmaGNZ

総合スコア10258

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

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

Hinomae

2022/08/04 07:54

else{ //速度の値を0~255の整数に正規化 var alpha = byte(vel * 255.0 / 30.0); _mesh.material.color = new Color32(0, 0, 0, alpha); } 上記のようにbyte型へのキャストを試みたのですがエラーメッセージが次のように出ました。 invalid expression term 'byte' 疑問の中身がかなり初歩的になってしまいますが、キャストのやり方の問題でしょうか。
YAmaGNZ

2022/08/04 10:25

キャストするなら(byte)(vel * 255.0 / 30.0)かと
Hinomae

2022/08/05 02:16

無事解決しエラーが吐かなくなりました。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問