Create with Code # Unit 4 – Gameplay Mechanics

作者: zsh2517 分类: Unity 发布时间: 2020-02-29 21:40

官网链接 Create with Code

系列链接
Unit 1 – Player Control
Unit 2 – Basic Gameplay
Unit 3 – Sound and Effects
Unit 4 – Gameplay Mechanics
Unit 5 – User Interface

Unit 4 – Gameplay Mechanics’

任务

目的
1. 视角跟随的另外一个方式 子对象
2. 生成怪物的波次
3. BUFF 加成
4. 向量单位化
5. 敌人的定向移动
6. 物理材质
内容
在一个悬空的平台上,玩家控制黑球,将全部白球撞下平台后开启下一轮。
每轮均生成一个 BUFF 物体(powerup ,获得 15x 的弹力将 Enemy 弹开), BUFF 持续时间为 7s

要点

视角跟随的另外一个方式 子对象

建立一个空对象 Focal PointMain Camera 作为 Focal Point 的子对象。这样 Focal Point 的任何操作(比如位移旋转)会同样作用到 Main Camera
之后平台的旋转实际上只需要旋转 Focal Point 使实际上的镜头旋转即可。

float horizontalInput = Input.GetAxis("Horizontal");
transform.Rotate(Vector3.up, horizontalInput* rotationSpeed /* 60 */ * Time.deltaTime);

生成怪物的波次

记录波次,然后根据波次进行生成(比如第 i 波调用 i 次的 Instantiate

每波次结束的判断(Enemy 是预先做好的 prefab)

int enemyCount = FindObjectsOfType<Enemy>().Length; // 能找到的 Enemy 个数,即剩余个数

BUFF 加成

每个波次生成敌人的时候也生成

Instantiate(powerupPrefab, GetSpawnPosition(), powerupPrefab.transform.rotation);

碰撞机制的改变,原来的弹性碰撞不够,再加上一个返向的力

private void OnCollisionEnter(Collision other)
{
    if (other.gameObject.CompareTag("enemy") && hasPowerup)
    {
        Rigidbody enemyRigidbody = other.gameObject.GetComponent<Rigidbody>();
        Vector3 awayFromPlayer = other.gameObject.transform.position - transform.position;
        enemyRigidbody.AddForce(awayFromPlayer * powerupStrength, ForceMode.Impulse);
        Debug.Log("Collided wit " + other.gameObject.name + " with power set to " + hasPowerup);
    }
}

BUFF 光环始终存在且位于正确位置,需要的时候显示出来( gameObject.SetActive(true)
BUFF 的物品是 Trigger

void Update()
{
    float forwardInput = Input.GetAxis("Vertical");
    playerRb.AddForce(focalObject.transform.forward * forwardInput * speed);
    powerupIndicator.transform.position = transform.position + new Vector3(0, -0.5f, 0);
}

private void OnTriggerEnter(Collider other)
{
    if (other.CompareTag("powerup"))
    {
        Destroy(other.gameObject);
        hasPowerup = true;
        powerupIndicator.gameObject.SetActive(true);
        StartCoroutine(PowerupCountdownRoutine());  
    }
}

IEnumerator PowerupCountdownRoutine()
{
    yield return new WaitForSeconds(7);
    powerupIndicator.gameObject.SetActive(false);

    hasPowerup = false;
}

向量单位化

Vector3 lookDirection = (player.transform.position - transform.position).normalized;

敌人的定向移动

void Update()
{
    Vector3 lookDirection = (player.transform.position - transform.position).normalized;
    // 向量单位化,这样添加的力始终不变
    enemyRb.AddForce(lookDirection * speed);
    if (transform.position.y < -10)
    {
        Destroy(gameObject);
    }
}

物理材质

Physic Material
Dynamic Friction 动摩擦力(0~1)
Static Friction 静摩擦力(0~1)
Bounciness 反弹(碰撞系数?)
Friction Combine 摩擦力组合方式
Bounce Combine 弹力组合方式

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

标签云