(Unity)外部からプレーヤーの速度を変化させる3つの方法(直接アクセス/メソッド経由/プロパティ経由)

(想定例)

  • アイテムを取得するとプレーヤーの速度が変化する。


(1)フィールド変数に直接アクセスする方法

<プレーヤーサイドのスクリプト>

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

public class Ball_Direct : MonoBehaviour
{
    private Rigidbody rb;

    // ★外部からアクセスできるように「public」にする。
    public float speed;

    void Start()
    {
        if(!TryGetComponent(out rb))
        {
            rb = this.gameObject.AddComponent<Rigidbody>();
        }
    }

    void Update()
    {
        float moveH = Input.GetAxis("Horizontal");
        float moveV = Input.GetAxis("Vertical");
        Vector3 movement = new Vector3(moveH, 0, moveV);
        rb.AddForce(movement * speed);
    }
}

<アイテムサイドのスクリプト>

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

public class SpeedUP : MonoBehaviour
{
    private void OnTriggerEnter(Collider other)
    {
        if(other.CompareTag("Player"))
        {
            // ★フィールドに直接アクセスしてスピードを変更する。
            other.GetComponent<Ball_Direct>().speed = 10;
        }
    }
}

(2)メソッド経由で変更する方法

<プレーヤーサイドのスクリプト>

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

public class Ball_Method : MonoBehaviour
{
    private Rigidbody rb;
    // ★フィールド変数には外部から直接アクセスできないようにする。
    private float speed = 3;

    void Start()
    {
        if(!TryGetComponent(out rb))
        {
            rb = this.gameObject.AddComponent<Rigidbody>();
        }
    }

    void Update()
    {
        float moveH = Input.GetAxis("Horizontal");
        float moveV = Input.GetAxis("Vertical");
        Vector3 movement = new Vector3(moveH, 0, moveV);
        rb.AddForce(movement * speed);
    }

    // ★speedを変更するメソッド(このメソッドは外部からアクセスできるように「public」にする)
    public void ChangeSpeed(int amount)
    {
        speed = amount;
    }
}

<アイテムサイドのスクリプト>

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

public class SpeedUP : MonoBehaviour
{
    private void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Player"))
        {
            // ★メソッド経由でスピードを変更する。
            other.GetComponent<Ball_Method>().ChangeSpeed(10);
        }
    }
}

(3)プロパティ経由で変更する方法

<プレーヤーサイドのスクリプト>

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

public class Ball_Property : MonoBehaviour
{
    private Rigidbody rb;
    private float speed = 3;

    // ★プロパティ(外部からアクセスできるようにする)
    public float Speed
    {
        // setアクセサ(フィールドに値を設定する)
        set
        {
            speed = value;
        }
    }

    void Start()
    {
        if(!TryGetComponent(out rb))
        {
            rb = this.gameObject.AddComponent<Rigidbody>();
        }
    }

    void Update()
    {
        float moveH = Input.GetAxis("Horizontal");
        float moveV = Input.GetAxis("Vertical");
        Vector3 movement = new Vector3(moveH, 0, moveV);
        rb.AddForce(movement * speed);
    }
}

<アイテムサイドのスクリプト>

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

public class SpeedUP : MonoBehaviour
{
    private void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Player"))
        {
            // ★プロパティによってスピードを変更する。
            other.GetComponent<Ball_Property>().Speed = 10;
        }
    }
}

(4)プロパティの改良・・・>自動プロパティで速度を設定

<プレーヤーサイドのスクリプト>

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

public class Ball_Property2 : MonoBehaviour
{
    private Rigidbody rb;

    // ★自動プロパティ(変数の定義も省略)
    public float Speed { get; set; }

    void Start()
    {
        if(!TryGetComponent(out rb))
        {
            rb = this.gameObject.AddComponent<Rigidbody>();
        }
    }

    void Update()
    {
        float moveH = Input.GetAxis("Horizontal");
        float moveV = Input.GetAxis("Vertical");
        Vector3 movement = new Vector3(moveH, 0, moveV);
        rb.AddForce(movement * Speed);
    }
}

<アイテムサイドのスクリプト>

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

public class SpeedUP : MonoBehaviour
{
    private void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Player"))
        {
            // ★自動プロパティによってスピードを設定する。
            other.GetComponent<Ball_Property2>().Speed = 5;
        }
    }
}