反映!(Unityメモ書き

ということで、
今回はUnityで複数のオブジェクトをスクリプトで操作
することを書いておこうと思います

 

前回はスクロールバーを使って
リストを作ったわね
今回はそのリストを選択すると中央の表示が変わるっていうのをやってみるわ

 

ここからプログラムを多用する感じだな
とは言え、独学なので間違いがあったら指摘してほしいな
一応、参考書3冊ぐらい買ってるけど、ほとんど読んでないし

 

ということで
リストを選択して、真ん中の画面に反映するのをやってみます
詳しくは「続きを読む」からどうぞー

 


まず、
リストを生成します
で、それが下のソースコードになります

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

/// 
/// キャラクターセレクトのスクロール項目を作成する
///
public class CharaterSelectScrollViewScript : MonoBehaviour 
{ 
    ///【外部取得】 スクロールオブジェクト
    public GameObject ParentScrollView; 
  /// キャラリスト
    private List CharaterList; 

    // Use this for initialization 
    void Start () 
    { 
        GameDataScript GameData = GameDataScript.Instance; // 項目を作成する 
        for (int n = 0; n < GameData.CharacterNameList.Count; n++) 
        { 
            // プレハブを取得 
            GameObject prefab = (GameObject)Resources.Load("common/SelectNamePanel"); 
            
            // プレハブからインスタンスを生成 
            GameObject tmpSelectNamePanel = Instantiate(prefab, Vector3.zero, Quaternion.identity); 
            tmpSelectNamePanel.transform.SetParent(ParentScrollView.transform); 
            tmpSelectNamePanel.transform.localScale = Vector3.one; 
            tmpSelectNamePanel.transform.position = Vector3.zero; 
            tmpSelectNamePanel.transform.localPosition = new Vector3(0, -50 - (n * 65), 0); 
            tmpSelectNamePanel.name = "List" + n.ToString(); 
            
            // 子オブジェクトのテキストオブジェクトとを取得 
            GameObject childObject = tmpSelectNamePanel.transform.FindChild("NameText").gameObject; 
            childObject.GetComponent().text = GameData.CharacterNameList[n]; 
        } 
    } 
    
    
    // Update is called once per frame 
    void Update () 
    { 
    
    } 
}
ゲーム上の生コードよ
単純に「common/SelectNamePanel」を生成して「ParentScrollView」に配置してるだけよ
ParentScrollViewはUnity側でスクロールバーのGameObjectを登録してるわ

 

当然上のソースはスクロールバーのGameObjectに登録するぞ
スクロールバーが表示されるとリストも生成されるようになる
もっといい方法があるのかもしれないけど、冬月はこう作ってる

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

///
/// 名前選択ボタンの設定
///
public class SelectNamePanelScript : MonoBehaviour 
{ 
    
    // Use this for initialization 
    void Start() 
    { 
    
    } 
    
    // Update is called once per frame 
    void Update() 
    { 
    
    } 
    
    ///
    /// 選択したときの処理
    ///
    public void OnClick() 
    { 
        GameDataScript GameData = GameDataScript.Instance; 
        // 子オブジェクトのテキストオブジェクトとを取得 
        GameObject childObject = this.transform.FindChild("NameText").gameObject; 
        string CharNameText = childObject.GetComponent().text; 
        
        // 名前からキャラクターの番号を取得 
        GameData.SelectCharacterNum = GameDataScript.Instance.GetNumberFromName(childObject.GetComponent().text); 
        
        //キャラクターイメージ欄 
        GameObject CharacterImagePanel = GameObject.Find("CharacterImagePanel"); 
        
        // 子の名前テキスト 
        GameObject childCharacterNameText = CharacterImagePanel.transform.FindChild("NameText").gameObject; 
        childCharacterNameText.GetComponent().text = CharNameText; 
        
        // 子のステータステキスト 
        List statusTextList = new List(); 
        CharacterDataScript tmpCharacterDataScript = new CharacterDataScript(GameDataScript.Instance.SelectCharacterNum);
        statusTextList = tmpCharacterDataScript.GetStatusTextList(); 
        GameObject childCharacterStatusText1 = CharacterImagePanel.transform.FindChild("StatusText1").gameObject; 
        childCharacterStatusText1.GetComponent().text = statusTextList[0]; 
        GameObject childCharacterStatusText2 = CharacterImagePanel.transform.FindChild("StatusText2").gameObject; 
        childCharacterStatusText2.GetComponent().text = statusTextList[1]; 
        GameObject childCharacterStatusText3 = CharacterImagePanel.transform.FindChild("StatusText3").gameObject; 
        childCharacterStatusText3.GetComponent().text = tmpCharacterDataScript.GetAttackStatusText(); 
        
        // スキルカード 
        GameObject childCharacterSkillText = CharacterImagePanel.transform.FindChild("SkillStatusText").gameObject; 
        childCharacterSkillText.GetComponent().text = tmpCharacterDataScript.GetSkillDataText(GameDataScript.Instance.SelectSkillIndex);
        } 
    }
}
いきなり本編ですが
リスト側のボタン処理になります
これはPrefabに保存しているボタンオブジェクトに登録します

 

処理の流れとしては
onClick()関数にクリックされたときに処理されるようにしておき、各GameObjectにデータを投げる
感じになってます

 

string CharNameText = childObject.GetComponent().text;で
今このリストに表示されている名前(判断するためのもの)を引っ張ってきて
それからこのボタンが何かを判別し処理を分けてるわ

 

肝心なのは
GameObject CharacterImagePanel = GameObject.Find(“CharacterImagePanel”);これね
Hierarchyから同じ名前のGameObjectを取得するぞ

 

そしてこうやって
GameObject childCharacterStatusText1 = CharacterImagePanel.transform.FindChild(“StatusText1”).gameObject;とすれば
子レイヤーのGameObjectも取得できます

 

子レイヤーはテキストオブジェクトなので
childCharacterStatusText1.GetComponent().text = statusTextList[0]としてテキストの変更を行っています
いちおうこんな感じに作れば一方のオブジェクトから一方を操作することが出来ます

気軽にコメントをどうぞ!

この記事に関すること冬月に聞きたいこと等、小さいことでもコメントしていただける嬉しいです。冬月に直接連絡したい方は下のお問合せフォームをお使いください。(メール送信されます)

内容に問題なければ、下記の「コメントを送信する」ボタンを押してください。※メールアドレスは公開されることは有りません。


The reCAPTCHA verification period has expired. Please reload the page.

ゲーム製作の関連記事