(想定例)
- アイテムを取得するとプレーヤーの速度が変化する。
(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;
}
}
}