Unity的C#编程教程_51_method/function 方法应用练习题

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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值