8. Unity スクリプト パラメータ入力、キーボード コントロール、コンポーネント スクリプト呼び出し

1. スクリプト パラメータ:

一部のパブリック属性はスクリプト ファイルで定義できます, 対応する属性もエディターに表示されます. エディターで属性の値を直接変更できます. 次のコードは、回転速度属性を public で変更します:

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

public class SampleLogic : MonoBehaviour
{
    
    
    //必须使用public进行修饰,才能在编辑器中看到这个属性
    [Tooltip("这是旋转速度")]//加入这航代码好,在编辑器中当鼠标指针悬浮在此属性上方时会显示这个提示字符
    public float rotateSpeed = 20;

    // Start is called before the first frame update
    void Start()
    {
    
    
        Application.targetFrameRate = 60;//设定帧更新速率

    }

    // Update is called once per frame
    void Update()
    {
    
    
        float angleDelta = rotateSpeed * Time.deltaTime;

        //使用API实现
        this.transform.Rotate(0, angleDelta, 0, Space.Self);

    }
}

スクリプト ファイルを保存し、エディターを開くと、マウントされたスクリプトに、次の図に示すように、変更可能な同じ名前のプロパティがあることがわかります。 スクリプト パラメータの割り当ての順序: パラメータを追加
ここに画像の説明を挿入
する
場合スクリプトに値を定義するときにデフォルトを指定できます, スクリプトが実行されると, 最初の初期化のために Awake 初期化関数に入ります. このとき, この関数でパラメータを再割り当てしてから, の設定を確認することもできます.エディタインターフェースのパラメータ. 変更された場合, インターフェースで設定されたパラメータ値が優先されます, そして、2番目の初期化のために開始初期化関数に入ります. この関数でパラメータの割り当てを実行することもできます. これは最後の割り当てです. start 関数の代入により、スクリプトが準実行されます。
パラメータの型:
値の型: int float など bool
値の型 (構造体): Vector3 など 色の
参照型 (クラス):

  • ノード: ゲームオブジェクトなど
  • コンポーネント: Transform MeshRenderer AudioSource など…
  • リソース: Material Texture AudioClip など...
  • 配列型

例:

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

public class SampleLogic : MonoBehaviour
{
    
    
    public GameObject flag;//将这个属性暴漏出去,需要在编辑器中进行赋值设置
    // Start is called before the first frame update
    void Start()
    {
    
    
        Application.targetFrameRate = 60;//设定帧更新速率

        this.transform.LookAt(flag.transform);//将移动物体看向目标物体,可实现物体的转向
    }

    // Update is called once per frame
    void Update()
    {
    
    
        Vector3 flagTrf = flag.transform.position;
        Vector3 objTrf = this.transform.position;
        Vector3 subTrf = flagTrf - objTrf;
        float minDistance = subTrf.magnitude;//根据坐标计算距离差值

        if(minDistance > 6.0f)//距离大于阈值时,才会移动物体,否则不移动
        {
    
    
            float speed = 3;    //定义移动速度
            float distance = speed * Time.deltaTime;    //速度与时间相乘计算出每次更新时移动的距离

            this.transform.Translate(0, 0, distance, Space.Self);//相对于自身坐标系进行z轴上的移动
        }
    }
}

エディターで上記のコードに属性フラグを指定します。次の図に示すように、階層ツリーでオブジェクトを選択し、対応する属性ボックスにオブジェクトをドラッグできます。
ここに画像の説明を挿入

2. 実行時のデバッグ:

エディターでゲームを実行すると、インスペクターのプロパティウィンドウで、オブジェクトに対応するプロパティ値が時々変化することがわかります. 同時に、実行中に特定のプロパティの値を手動で調整することができます.オブジェクトの移動速度プロパティの調整など、プログラム:
ここに画像の説明を挿入
ただし、ゲームの実行中、実行プロセス中に調整された属性値は自動的に保存されません。デバッグ後にこれらの最適な値を保存する場合は、プログラムの実行中にコンポーネントの右上隅を見つけて、**… をクリックし[コンポーネントのコピー] を選択して、図に示すようにすべてのプロパティ値をコピーします。下の図:
ここに画像の説明を挿入
次に、プログラムの実行が終了したら、コピーした最適な値を追加し、
*…をクリックし、 [コンポーネントの値の貼り付け]*** を選択して、下の図に示すように、すべての属性値をコピーします。
ここに画像の説明を挿入

3. マウスおよびキーボード入力:

Unity で外部制御入力を受信するには、マウス ボタン入力の受信など、Inputを使用できます。

//鼠标输入
Input.GetMouseButton(0)//鼠标左键按下
Input.GetMouseButton(1)//鼠标右键按下
Input.GetMouseButton(2)//鼠标中键按下
Input.GetAxis("Mouse X");//鼠标横向移动
Input.GetAxis("Mouse Y");//鼠标纵向移动
Input.GetAxis("Horizontal");//横向轴
Input.GetAxis ("Vertical");//纵向轴

//键盘输入
Input.GetKey ("up")//上方向键按下
Input.GetKey ("down")//下方向键按下
Input.GetKey ("left")//左方向键按下
Input.GetKey ("right")//右方向键按下
Input.GetKey(KeyCode.W)//指定字母键按下

サンプルコード: オブジェクトにぶら下がった後、WASD上下左右キーを使用してオブジェクトの動きを制御できます。

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

public class TestLogic : MonoBehaviour
{
    
    
    public GameObject target;
    public float speed = 3;
    // Start is called before the first frame update
    void Start()
    {
    
    
        Application.targetFrameRate = 60;

        this.transform.LookAt(target.transform);
    }

    // Update is called once per frame
    void Update()
    {
    
    
        Vector3 targetTrf = target.transform.position;
        Vector3 objTrf = this.transform.position;
        Vector3 subTrf = targetTrf - objTrf;
        float minDistance = subTrf.magnitude;

        // W 键或者 ↑ 键按下
        if(minDistance > 3.0f && (Input.GetKey (KeyCode.W) || Input.GetKey("up")))
        {
    
    
            //向前移动
            float distance = speed * Time.deltaTime;
            this.transform.Translate(0,0,distance,Space.Self);
        }
        // S 键或者 ↓ 键按下
        if(minDistance > 3.0f && (Input.GetKey (KeyCode.S) || Input.GetKey("down")))
        {
    
    
            //向后移动
            float distance = speed * Time.deltaTime;
            this.transform.Translate(0,0,-distance,Space.Self);
        }
        // A 键或者 ← 键按下
        if(minDistance > 3.0f && (Input.GetKey (KeyCode.A) || Input.GetKey("left")))
        {
    
    
            //向左移动
            float distance = speed * Time.deltaTime;
            this.transform.Translate(-distance,0,0,Space.Self);
        }
        // D 键或者 → 键按下
        if(minDistance > 3.0f && (Input.GetKey (KeyCode.D) || Input.GetKey("right")))
        {
    
    
            //向左移动
            float distance = speed * Time.deltaTime;
            this.transform.Translate(distance,0,0,Space.Self);
        }
    }
}

4. 他のコンポーネントを追加します (コンポーネントの追加):

In the editor interface, select any object model with the mouse, and you will see its associated properties in the property window . 同時に、下部に[コンポーネントを追加]ボタンがあり、これを使用して他のオブジェクトをハングアップすることができます。下の図に示すように、AudioSource などのコンポーネント: をクリックして[Audio] -> [Audio Source]
ここに画像の説明を挿入
を選択し、モデルに効果音コンポーネントを追加し、効果音ファイルを対応するボックスにドラッグ アンド ドロップして設定します。いくつかのプロパティ。その中で、次の図に示すように、 Play On Awake属性は実行時の起動を指定し、 Loop属性はループ再生を有効にします。
ここに画像の説明を挿入

4.1 コード制御コンポーネント (Getomponent)

コードでコンポーネントを取得するには、this.GetComponent<type>() を使用できます;
例は次のとおりです: マウスの左ボタンをクリックして、サウンド効果の開始を制御します (最初にインターフェイスで autoplay プロパティをオフにします)。

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

public class TestLogic : MonoBehaviour
{
    
    
    // Start is called before the first frame update
    void Start()
    {
    
    
        Application.targetFrameRate = 60;
    }

    // Update is called once per frame
    void Update()
    {
    
    
        if(Input.GetMouseButtonDown(0))//捕获鼠标左键
        {
    
    
            playAudio();
        }
    }

    void playAudio()
    {
    
    
    	//获取AudioSource组件
        AudioSource audio = this.GetComponent<AudioSource>();
        if(audio.isPlaying)
        {
    
    
            Debug.Log("停止播放音乐...");
            audio.Stop();
        }
        else
        {
    
    
            Debug.Log("开始播放音乐...");
            audio.Play();
        }
    }
}

4.2 コンポーネントパラメータ

コンポーネントをモデルに追加すると、インターフェイス エディターで設定できる多くのプロパティがあることがわかります。これらのプロパティは、コード スクリプトでもアクセスおよび変更できます。たとえば、上の図の黄色のボックス内のプロパティは、このコンポーネントを取得した後に変更できます。コードは次のとおりです。

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

public class TestLogic : MonoBehaviour
{
    
    
    // Start is called before the first frame update
    void Start()
    {
    
    
        Application.targetFrameRate = 60;
    }

    // Update is called once per frame
    void Update()
    {
    
    
        if(Input.GetMouseButtonDown(0))//捕获鼠标左键
        {
    
    
            playAudio();
        }
    }

    void playAudio()
    {
    
    
    	//获取AudioSource组件
        AudioSource audio = this.GetComponent<AudioSource>();
        //获取组件后开始更改属性:
        audio.loop = true;//设置循环播放
        audio.mute = true;//设置静音
    }
}

4.3 他のコンポーネントの参照

スクリプト ファイルで、他のモデルによってマウントされたコンポーネントにアクセスしたい場合がありますが、これも操作可能です. たとえば、最初のモデルに AudioSource コンポーネントを掛けた場合、2 番目のモデルのスクリプトで最初のコンポーネントを取得したい場合があります.図に示すように、モデルの下の音楽コンポーネント:
ここに画像の説明を挿入
最初の方法: (一般的には使用されません)
最初に 2 番目のモデル スクリプトでターゲット モデルを取得し、次にこのモデルの下で独自のコンポーネントを取得します。サンプル コードは次のとおりです。

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

public class SecondLogic : MonoBehaviour
{
    
    
    public GameObject audioObj;		//在这里添加一个公共的属性,这样在界面编辑器中就可以给其赋值
    
    // Start is called before the first frame update
    void Start()
    {
    
    
        AudioSource audio = audioObj.GetComponent<AudioSource>();	//然后再在audioObj模型下寻找AudioSource组件
    }

    // Update is called once per frame
    void Update()
    {
    
    
        if(Input.GetMouseButtonDown(0))
        {
    
    
            audio.Play();	//开启
        }
    }
}

A public property audioObj is defined in the above code . インターフェイス エディターを開くと、2 番目のモデルのスクリプト コンポーネントに audioObj というプロパティがあることがわかります。そのため、ターゲット モデルをこのプロパティ ボックスにドラッグできます。 audioObj への変換が完了すると、2 番目のモデルのスクリプト ファイルで通常どおり使用できます. 割り当て操作は、下の図に示されてい
ここに画像の説明を挿入
ます
: method When defined an attribute, the type of attribute is GameObject , so you need to find the supported component AudioSource below it again. 2番目のメソッドは、属性のタイプをターゲットタイプとして直接設定します。他のコンポーネントの AudioSource コンポーネント、次にこの属性のタイプをAudioSourceに設定します。割り当て方法は最初の方法と同じで、ターゲット モデルをプロパティ ボックスにドラッグすることで、Unity が自動的に対応するコンポーネントをターゲット モデルの下に割り当ててから、次のように変数を直接使用してコードを操作することもできます。

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

public class SecondLogic : MonoBehaviour
{
    
    
    public AudioSource audio;//这里直接将属性类型设置为AudioSource 
    // Start is called before the first frame update
    void Start()
    {
    
    
        
    }

    // Update is called once per frame
    void Update()
    {
    
    
        if(Input.GetMouseButtonDown(0))
        {
    
    
            audio.Play();//直接使用
        }
    }
}

: スクリプト コンポーネントを参照する場合、定義された属性タイプがスクリプト コンポーネントのクラス タイプに変更されることを除いて、上記の参照方法と同じです。たとえば、secondLogic スクリプト コンポーネントを参照する場合次に、変数を設定するときに、次のように定義します。 Public SecondLogic scriptobj;

5. メッセージ呼び出し (SendMessage):

4番目のセクションでは、他のコンポーネントの参照は、コンポーネントを見つけてそのプロパティを直接設定することで実現されます. このメソッドを呼び出すメッセージの意味は、他のコンポーネントで目的のコンポーネントを見つけた後、それと同等のメッセージを送信できることを意味します.制御信号。ターゲット コンポーネントがこの信号を受信すると、それに応じて応答します。
例: secondObj で firstObj に信号を送信し、firstObj に音楽を開始させます。シーンは次の図のようになります。

コードは
次のとおりです。

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

public class SecondLogic : MonoBehaviour
{
    
    

    public GameObject target;	//在界面编辑器中对这个属性进行赋值

    // Start is called before the first frame update
    void Start()
    {
    
    
        
    }

    // Update is called once per frame
    void Update()
    {
    
    
        if(Input.GetMouseButtonDown(0))
        {
    
    
            //向目标节点发送一个‘消息’
            target.SendMessage("DoAudio");	//里面的参数是目标物体脚本文件中的函数
            target.SendMessage("StopAudio",3);//里面第一个参数是目标物体脚本文件中的函数名,后面的参数是函数需要的参数
        }
    }
}

FirstLogic.cs:

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

public class TestLogic : MonoBehaviour
{
    
    
    AudioSource audio;
    // Start is called before the first frame update
    void Start()
    {
    
    
        Application.targetFrameRate = 60;

        audio = this.GetComponent<AudioSource>();//获取本模型下的AudioSource组件
    }

    // Update is called once per frame
    void Update()
    {
    
    

    }

    public void DoAudio()	//定义执行函数,注意此函数名称和上面secondlogic.cs发送消息的函数中的参数保持一致
    {
    
    
        audio.Play();
    }
    public void StopAudio(int mCount)	//定义执行函数,注意此函数名称和上面secondlogic.cs发送消息的函数中的参数保持一致
    {
    
    
    	Debug.Log(mCount);
        audio.Play();
    }

}

インターフェイス エディターで、2 番目の Logic.csコードのtarget属性に値を割り当てます。
ここに画像の説明を挿入

継続的に更新しますので、より多くの注意を払ってください...

おすすめ

転載: blog.csdn.net/FY_13781298928/article/details/129916864