###前提・実現したいこと
・Unity初心者
・ゲームジャンル:キメラ格闘ゲーム
マリオカートの部品選択画面のように、キメラの部位を選択させる。前回の質問で3部品選択にさせることができたが、今回は4部品にさせたい。参考にしたページも一緒にのせておきます。
前回の質問ページ
前々回の質問ページ
[参考にしたページ](https://www.kuroshum.com/entry/2018/09/14/Unity%E3%81%A7%E7%84%A1%E9%99%90%E3%83%AB%E3%83%BC%E3%83%97%E5%9E%8B%E3%81%AE%E6%AD%A6%E5%99%A8%E9%81%B8%E6%8A%9EUI%E3%82%92%E5%AE%9F%E8%A3%85(%E3%82%A2%E3%83%8B%E3%83%A1%E3%83%BC%E3%82%B7)
###発生している問題・試したこと
部品を3個から4個にし、写真画像も4枚にさせ4通りから選べるようにしたいが、色々しらべてコードを変えてもできなかっため、教えてもらいたい。
・コードのprivateの数字部分を5から7に変更した。
・Unity上での白い四角の数を5から7に変更。
・コード内にある計算式の数字を変更したりした。
⇒これらのことを行ったが、できなかったため、変更する前のコードを記載。
このGif画像は実際に実装しているところです。下のコードはGifでいう左のスロットの真ん中を動かしているコードです。
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class Player1body : MonoBehaviour 7{ 8 //各部分のスプライト 9 [SerializeField] 10 private Sprite FlyPanSprite; 11 [SerializeField] 12 private Sprite TortoiseSprite; 13 [SerializeField] 14 private Sprite ScorpionSprite; 15 16 //スプライトを表示する用のゲームオブジェクト(UI->Image) 17 [SerializeField] 18 private GameObject[] Animaru = new GameObject[5]; 19 20 //表示する用のオブジェクト(UI->Image)のImageを設定する変数 21 private Image[] AnimaruImage = new Image[5]; 22 23 //表示する用のオブジェクト(UI->Image)の位置・スケールを設定する変数 24 //UIなので、RectTransformを使用 25 private RectTransform[] AnimaruRect = new RectTransform[5]; 26 27 //武器選択UIの真ん中に表示している動物画像の座標 28 private Vector2 Main = new Vector2(-176f, 61f); 29 30 //0 : 動物画像を透明にする基準座標 31 //1 : 動物画像を逆の端に移動する基準座標 32 private Vector2 Up0 = new Vector2(-176f, 0f); 33 private Vector2 Up1 = new Vector2(-176f, -101f); 34 private Vector2 Down0 = new Vector2(-176f, 142f); 35 private Vector2 Down1 = new Vector2(-176f, 223f); 36 37 //動物画像をスライド(変更)させた後の座標(目的地の座標) 38 private Vector2[] Target = new Vector2[5]; 39 40 //スライド(変更)する前の座標(現在の座標) 41 private Vector2[] AnimaruRectPos = new Vector2[5]; 42 43 //スライド(変更)をするかのフラグ 44 private bool SlideFlag; 45 46 //スライド(変更)する前の座標(現在の座標)を保存するためのフラグ 47 //現在の座標を保存するためには、スライドするためのループ処理の一回目だけ座標を保存する処理をする必要がある 48 private bool PosFlag = true; 49 50 //現在設定している動物の数 51 private int AnimaruLevel = 3; 52 53 /* 54 スライドする方向 55 0 : 左方向 56 1 : 右方向 57 */ 58 private int Dir = 0; 59 60 public int WeponType { private set; get; } 61 62 //AnimaruLevelが3の時の設定 63 public void SetLevelThree() 64 { 65 for (int i = 0; i < Animaru.Length; i++) 66 { 67 AnimaruImage[i] = Animaru[i].GetComponent<Image>(); 68 AnimaruRect[i] = Animaru[i].GetComponent<RectTransform>(); 69 70 //動物画像が初期状態からバラバラになっている可能性があるので、上から下に動物画像0~4を整列させる 71 AnimaruRect[i].localPosition = new Vector2(-176f, 169f - i * 54); 72 73 //真ん中以外の動物画像のサイズを 1/1.8 にする 74 if (i == 2) 75 { 76 AnimaruRect[i].localScale = new Vector3(2.0f, 2.0f, 1); 77 } 78 else 79 { 80 AnimaruRect[i].localScale = new Vector3(1 / 1.2f, 1 / 1.2f, 1 / 1.2f); 81 } 82 83 /* 84 * 真ん中の左隣にナイフ 85 * 真ん中にフライパン 86 * 真ん中の右隣りにハンドガン 87 * 左端には真ん中の右隣りの動物 88 * 右端には真ん中の左隣りの動物 89 */ 90 switch (i) 91 { 92 case 1: 93 AnimaruImage[i].sprite = TortoiseSprite; 94 break; 95 case 2: 96 AnimaruImage[i].sprite = FlyPanSprite; 97 break; 98 case 3: 99 AnimaruImage[i].sprite = ScorpionSprite; 100 break; 101 case 4: 102 AnimaruImage[0].sprite = AnimaruImage[3].sprite; 103 AnimaruImage[i].sprite = AnimaruImage[(i + 3) % 6].sprite; 104 break; 105 } 106 107 /* 108 * 両端の動物画像を透明、真ん中3つの画像はそのまま 109 */ 110 if (i == 0 || i == 4) AnimaruImage[i].color = new Color(255, 255, 255, 0); 111 else AnimaruImage[i].color = new Color(255, 255, 255, 255); 112 } 113 } 114 115 //動物画像を上、もしくは下にスライドさせる 116 public void SlideWepon() 117 { 118 if (SlideFlag) 119 { 120 121 //動物画像の数(5個)全てをスライドさせる 122 for (int i = 0; i < Animaru.Length; i++) 123 { 124 if (PosFlag) 125 { 126 AnimaruRectPos[i] = AnimaruRect[i].localPosition; 127 } 128 129 //上にスライドさせる場合 130 if (Dir == 0) 131 { 132 //スライド後(目的地)の座標を指定 133 Target[i] = new Vector2(AnimaruRectPos[i].x, AnimaruRectPos[i].y - 54f); 134 135 /* 136 * 動物画像を目的地に移動させる 137 * 移動座標がDown0を超えたら動物画像を透明から元に戻す 138 * 移動座標がUp0を超えたら動物画像を透明にする 139 * 移動座標がUp1(上)になったら下に瞬間移動させる 140 */ 141 AnimaruRect[i].localPosition = Vector2.MoveTowards(AnimaruRect[i].localPosition, Target[i], Time.deltaTime * 200); 142 if (AnimaruRect[i].localPosition.y <= Down0.y) 143 { 144 AnimaruImage[i].color = new Color(255, 255, 255, 255); 145 } 146 if (AnimaruRect[i].localPosition.y <= Up0.y) 147 { 148 AnimaruImage[i].color = new Color(255, 255, 255, 0); 149 } 150 if (AnimaruRect[i].localPosition.y == Up1.y) 151 { 152 AnimaruRect[i].localPosition = new Vector2(Down1.x, Down1.y - 54f); 153 } 154 } 155 else 156 { 157 /* 158 * スライド後(目的地)の座標を指定 159 */ 160 Target[i] = new Vector2(AnimaruRectPos[i].x, AnimaruRectPos[i].y + 54f); 161 /* 162 * 動物画像を目的地に移動させる 163 * 移動座標がUp0を超えたら武器画像を透明から元に戻す 164 * 移動座標がDown0を超えたら武器画像を透明にする 165 * 移動座標がDown1(下)になったら上端に瞬間移動させる 166 */ 167 AnimaruRect[i].localPosition = Vector2.MoveTowards(AnimaruRect[i].localPosition, Target[i], Time.deltaTime * 200); 168 if (AnimaruRect[i].localPosition.y >= Up0.y) 169 { 170 AnimaruImage[i].color = new Color(255, 255, 255, 255); 171 } 172 if (AnimaruRect[i].localPosition.y >= Down0.y) 173 { 174 AnimaruImage[i].color = new Color(255, 255, 255, 0); 175 } 176 177 if (AnimaruRect[i].localPosition.y == Down1.y) 178 { 179 AnimaruRect[i].localPosition = new Vector2(Up1.x, Up1.y + 54f); 180 } 181 } 182 183 //動物画像が目的地まで移動できたらスライドを終了する 184 if (AnimaruRect[i].localPosition.y == Target[i].y) 185 { 186 SlideFlag = false; 187 } 188 189 190 //武器画像のどれかが真ん中の座標に移動した場合 191 if (AnimaruRect[i].localPosition.y == Main.y) 192 { 193 /* 194 * カメ : WeponTypeを0にする 195 * サソリ : WeponTypeを1にする 196 * フライパン : WeponTypeを2にする 197 */ 198 if (AnimaruImage[i].sprite == TortoiseSprite) 199 { 200 WeponType = 0; 201 } 202 else if (AnimaruImage[i].sprite == ScorpionSprite) 203 { 204 WeponType = 1; 205 } 206 else 207 { 208 WeponType = 2; 209 } 210 /* 211 * 武器画像の大きさを1にする(他は1/1.8) 212 */ 213 AnimaruRect[i].localScale = new Vector3(2.0f, 2.0f, 1); 214 215 /* 216 * WeponLevel別に武器選択UIの配置を設定する 217 * WeponLevel 2 : 現在装備中(真ん中に配置している)の武器画像を両端に設定する 218 * WeponLevel 3 : 真ん中の右隣の武器画像を左端に設定する 219 * 真ん中の左隣の武器画像を右端に設定する 220 */ 221 if (AnimaruLevel == 2) 222 { 223 AnimaruImage[(i + 2) % 5].sprite = AnimaruImage[i].sprite; 224 AnimaruImage[(i + 3) % 5].sprite = AnimaruImage[i].sprite; 225 } 226 if (AnimaruLevel == 3) 227 { 228 AnimaruImage[(i + 2) % 5].sprite = AnimaruImage[(i + 4) % 5].sprite; 229 AnimaruImage[(i + 3) % 5].sprite = AnimaruImage[(i + 1) % 5].sprite; 230 } 231 /* 232 * 真ん中以外の武器画像のサイズを 1/1.8 にする 233 */ 234 } 235 else 236 { 237 AnimaruRect[i].localScale = new Vector3(1 / 1.2f, 1 / 1.2f, 1 / 1.2f); 238 } 239 } 240 PosFlag = false; 241 } 242 } 243 244 // Use this for initialization 245 void Start() 246 { 247 SetLevelThree(); 248 } 249 250 // Update is called once per frame 251 void Update() 252 { 253 if (Input.GetKeyDown(KeyCode.G) && !SlideFlag) 254 { 255 SlideFlag = true; 256 PosFlag = true; 257 Dir = 0; 258 } 259 if (Input.GetKeyDown(KeyCode.H) && !SlideFlag) 260 { 261 SlideFlag = true; 262 PosFlag = true; 263 Dir = 1; 264 } 265 266 SlideWepon(); 267 } 268} 269
###Unity ver
2019.4.14f1
あなたの回答
tips
プレビュー