Change Position Four Ways
- 在 unity 中改变游戏对象的位置,我们需要使用
tranform.position
,设定一个new Vector3
比如我们把脚本挂载在一个 cube 下面:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test3 : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
transform.position = new Vector3(0, 0, 0); // 设置到原点位置
}
// Update is called once per frame
void Update()
{
}
}
游戏启动的时候,该 cube 就会被重置到原点的位置。
另一种方法,编写一个方法:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test3 : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
ChangePosition(); // 调用方法
}
// Update is called once per frame
void Update()
{
}
private void ChangePosition()
{
transform.position = Vector3.zero; // 重置位置到原点
}
}
可以起到同样的效果
另外为了增加程序的复用性,我们可以把目标位置改成可传入的参数:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test3 : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
ChangePosition(new Vector3(0,0,0)); // 调用方法,并传入位置参数
}
// Update is called once per frame
void Update()
{
}
private void ChangePosition(Vector3 targetPosition) // 设定一个传入参数
{
transform.position = targetPosition; // 设定为目标位置
}
}
甚至,我们可以把获取位置的部分放入一个新的方法中:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test3 : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
ChangePosition(getPosition());
// 调用位置获取方法,获得位置
// 调用设定位置的方法,并位置
}
// Update is called once per frame
void Update()
{
}
private void ChangePosition(Vector3 targetPosition)
{
transform.position = targetPosition;
}
private Vector3 getPosition() // 获取位置的方法
{
return Vector3.zero; // 返回原点的位置
}
}
为了更具灵活性,我们可以将获取位置的方法改为需要传入参数:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test3 : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
ChangePosition(getPosition(1.0f, 2.0f, 3.0f));
}
// Update is called once per frame
void Update()
{
}
private void ChangePosition(Vector3 targetPosition)
{
transform.position = targetPosition;
}
private Vector3 getPosition(float x,float y,float z)
{
Vector3 targetPositon = new Vector3(x, y, z);
return targetPositon;
}
}
Challenge: Are You Alive?
- 任务说明:
- 设计程序,每次按下空格键,玩家扣血随机值
- 然后返回玩家状态:存活/死亡
- 玩家死亡后,按下空格键也不会调取扣血方法
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test4 : MonoBehaviour
{
public int health; // 血量
public int lowDamage; // 攻击最小扣血
public int highDamage; // 攻击最大扣血
public string result;
// Start is called before the first frame update
void Start()
{
health = 100; // 初始化血量
lowDamage = 1; // 初始化最小攻击
highDamage = 10; // 初始化最大攻击
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.Space)) // 按下空格表示一次攻击
{
health = GetHit(health, lowDamage, highDamage); // 调用扣血方法
result = TestAlive(); // 调用方法检测生存状态
Debug.Log("Your health: " + health); // 显示血量
Debug.Log(result); // 显示状态
}
}
private string TestAlive()
{
string result;
if (health > 0)
{
result = "You're still alive!";
}
else
{
result = "You're dead now!";
}
return result;
}
private int GetHit(int healthLeft,int low,int high)
{
healthLeft -= Random.Range(low, high); // 随机扣血
if (healthLeft < 0)
{
healthLeft = 0;
}
return healthLeft;
}
}
这里要注意,实现方法并不是唯一的!
另外,通常我们也可以设定一个 bool 变量用于存储角色状态(生存/死亡)
Return Array
- 任务说明:
- 创建 3 个 cube
- 把 Tag 都设置为 player
- 通过脚本选定这 3 个 cube
- 随机改变 cube 的颜色
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test5 : MonoBehaviour
{
public GameObject[] allPlayers; // 初始化一个游戏对象的 array
// Start is called before the first frame update
void Start()
{
allPlayers = FindAllPlayers(); // 找到所有的 Player,放入 array 中
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
ChangeColor(allPlayers); // 每次按下空格键调用改变颜色的方法
}
}
private GameObject[] FindAllPlayers()
{
GameObject[] allPlayers = GameObject.FindGameObjectsWithTag("Player");
return allPlayers;
}
private void ChangeColor(GameObject[] targets)
{
foreach(var item in targets) // 遍历列表中的元素
{
item.GetComponent<MeshRenderer>().material.color = new Color(Random.value, Random.value, Random.value);
// 随机改变颜色,其中 Random.value 获得的值是 0~1,Color 的 3 个参数对应 RGB 通道
}
}
}
Challenge: Position Matters
- 任务说明:
- 用 array 保存 4 个不同的位置
- 使用一个方法生成随机序号
- 使用另一个方法,根据序号更新游戏对象的位置
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test6 : MonoBehaviour
{
public Vector3[] positions = new Vector3[4]; // 创建一个列表存放 4 个位置
// Start is called before the first frame update
void Start()
{
for (int i = 0; i < 4; i++) // 随机生成 4 个位置
{
positions[i] = new Vector3(Random.value * 10, Random.value * 10, Random.value * 10);
}
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
ChangePosition();
}
}
private void ChangePosition() // 改变位置
{
transform.position = positions[RandomID()];
}
private int RandomID() // 生成随机序号
{
return Random.Range(0, positions.Length);
}
}