Unity游戏角色按按键拾取物体

目标:游戏角色在可拾取物体前按下F键播放拾取动画,完成对目标物体的拾取

如下动图所示(速度加快了,主要看个效果,别介意)

实现方法

触发器和帧事件添加

主要通过的是GameObject的触发器以及动画的帧事件。

首先对游戏物体增加一个Sphere Collider组件,将该组件的Is Trigger勾选上,制作一个简易的触发器,如下图所示

 ,然后再在角色拾取动画中添加一个帧事件(这个游戏角色是在资源商店免费获取的,搜索关键字为:Character Pack),如下图所示

 之后编辑C#脚本进行操作

C#脚本

我创建了一个ItemBehavior类专门管理这些可拾取的物体,一个BoyBehavior类来管理游戏角色类,这里只展示实现该功能的部分代码

BoyBehavior类

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

public class BoyBehavior : MonoBehaviour
{
    //.........

    //标志位
    public bool isPickUp ;
    

    void Start
    {
        isPickUp =false;
    }

    //这里定义了在动画PickUp中的添加的帧方法
    public void PickUpThings()
    {
        isPickUp = true;
    }
    //.....

}

ItemBehavior类

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

public class ItemBehavior : MonoBehaviour
{
    public GameBehavior gameManager;

    public BoyBehavior boy;

    //这里使用onTriggerStay,即角色呆在触发器中
    private void OnTriggerStay(Collider other)
    {
        if (other.name == "Boy" && boy.isPickUp)
        {
            Destroy(this.transform.parent.gameObject);

            Debug.Log("Item collected!");

            gameManager.Items += 1;
            boy.isPickUp = false;
        }
    }
    
    void Start()
    {
        gameManager = GameObject.Find("Game Manager").GetComponent<GameBehavior>();
        //注意这里要对boy进行初始化,否则会报错
        boy = GameObject.Find("Boy").GetComponent<BoyBehavior>();
    }


}

代码解释:

首先在BoyBehavior类中创建了一个标志位isPickUp并将其初始化为false,当角色执行动画时会触发帧事件,即PickUpThings,在该方法中将isPickUp赋值为true。然后在ItemBehavior中写了onTriggerStay事件,在该事件中添加一个条件判断,当人物处在触发器范围内并且标志位isPickUp为true时,摧毁游戏事件,并将拾取的物体数加1。此外还要注意,在进行完这些操作之后要将isPickUp标志位重新置为false,否则人物一旦进入其他可拾取物体的触发器范围内将自动拾取,这是我们不希望看到的。

犯的错误:

将onTriggerStay误用成了onTriggerEnter,这一错误导致在运行游戏之后,人物在物体面前按下F键触发动画之后物体并没有消失,而是在人物重新进入触发器范围内物体才消失。原因就是两个函数的机制不同,onTriggerStay是在角色呆在触发器范围内才触发,而onTriggerEnter是在角色开始进入触发器范围内才会触发。

综上完成了初始目标要求

本文是对《Unity和C#游戏编程入门》该书籍中的Hero Born案例的改进,希望对大家有所帮助。

更正:

BoyBehavior类中的标志位的访问权限是public,这样的设置存在一定的问题,其权限为public时,在Unity编辑界面可以直接设置,如下图所示

 但是这个标志位并不应该在此处随意修改。所以对代码进行优化:

BoyBehavior类

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

public class BoyBehavior : MonoBehaviour
{
    //.........

    //标志位
    private bool isPickUp ;
    
    public bool PickUpFlag
    {
        get { return isPickUP;}
        set { isPickUp = value;}
    }


void Start
{
    isPickUp =false;
}

    //这里定义了在动画PickUp中的添加的帧方法
    public void PickUpThings()
    {
        isPickUp = true;
    }
    //.....

}

ItemBehavior类

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

public class ItemBehavior : MonoBehaviour
{
    public GameBehavior gameManager;

    public BoyBehavior boy;

    //这里使用onTriggerStay,即角色呆在触发器中
    private void OnTriggerStay(Collider other)
    {
        if (other.name == "Boy" && boy.PickUpFlag)
        {
            Destroy(this.transform.parent.gameObject);

            Debug.Log("Item collected!");

            gameManager.Items += 1;
            boy.PickUpFlag = false;
        }
    }
    
    // Start is called before the first frame update
    void Start()
    {
        gameManager = GameObject.Find("Game Manager").GetComponent<GameBehavior>();
        boy = GameObject.Find("Boy").GetComponent<BoyBehavior>();
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

这里主要使用了get和set属性对代码进行了优化

此外,由于需要可拾取的触发器来触发拾取操作,因此每个可拾取物体上都要挂载该脚本,因此这样的方法存在一定的缺陷,游戏物体和脚本之间的耦合性太高,如果某个物体有什么独特的拾取效果,比如这个物体是个假的宝石,拾取时会爆炸伤害玩家,那么单一修改该物体的脚本会导致其他物体的脚本全部被修改,从而所有的物体都变成了爆炸物品。因此可以换个思路。

该思路就是在游戏角色上添加一个触发器,当物体进入游戏角色的触发器范围内且游戏角色按下拾取键后拾取物体,该方法读者可以自己先实现,并不困难。

### 回答1: Unity官方提供的人物控制脚本是指Unity软件自带的一种用来控制游戏角色移动、跳跃和互动等操作的脚本。该脚本是Unity中非常常用的一部分,可用于创建第一人称、第三人称和平台游戏等不同类型的角色控制。 人物控制脚本通常包含以下几个主要功能: 1. 移动控制:通过键盘、鼠标或手柄等输入设备来控制角色在场景中的移动方向和速度。可以使用轴向输入或力的方式来实现不同的移动效果。 2. 跳跃控制:通过按键等方式触发角色的跳跃行为,并控制跳跃高度和距离。可以使用重力、力和动画等方式来模拟真实的跳跃效果。 3. 互动控制:控制角色与场景中的物体进行交互,如开门、拾取物品等。可以通过射线检测、触发器和碰撞器等方式来实现角色物体的交互逻辑。 4. 碰撞检测:检测角色与场景中的碰撞器发生碰撞,并触发相应的反应。可以用于检测角色与墙壁、敌人、障碍物等的碰撞情况,并处理相应的移动控制或伤害逻辑。 5. 动画控制:根据角色的移动状态和动作来控制角色动画播放。可以根据不同的输入和碰撞状态来切换不同的动画状态,使角色呈现出逼真的动作表现。 Unity官方提供的人物控制脚本可以作为游戏开发的起点,开发者可以基于此脚本进行更加复杂的角色控制逻辑的构建。同时,Unity还提供了丰富的文档和教程,帮助开发者理解和使用各项功能,并能够根据实际需求进行个性化的定制。 ### 回答2: Unity官方人物控制脚本是一个用于控制游戏角色移动的脚本。 首先,在Unity中,角色控制通常使用Character Controller组件,它负责处理角色的碰撞、重力和移动等方面的逻辑。 官方提供的人物控制脚本提供了一些常见的角色控制功能,比如角色的移动速度、跳跃高度、加速度等。通过在脚本中设置对应的参数,我们可以轻松地控制角色的行为。 该脚本还提供了一些内置的输入检测功能,比如检测玩家是否按下了键盘上的方向键、空格键等。通过这些输入检测的逻辑,可以实现角色的移动、跳跃等操作。 另外,官方人物控制脚本还包含了一些常见的动画过渡逻辑,比如角色的奔跑、行走、站立等动作。通过在脚本中设置对应的动画触发条件,可以让角色在不同的情况下播放不同的动画。 总之,Unity官方人物控制脚本提供了一个便捷的方式来控制游戏中的角色。通过简单的设置和调整,我们可以实现角色的基本移动、跳跃和动画播放等功能。在开发游戏时,使用官方提供的人物控制脚本可以大大减少我们的工作量,提高开发效率。 ### 回答3: Unity官方提供的人物控制脚本是一种基于脚本的解决方案,用于控制游戏中的角色行为。这个脚本包含了一系列函数和变量,可以用于实现角色的移动、跳跃、旋转等基本动作。 在Unity官方的人物控制脚本中,常见的变量包括速度变量、重力变量、角色控制器等。通过改变这些变量的数值,可以调整角色的移动速度、重力表现和碰撞检测等行为。 此外,Unity官方人物控制脚本还提供了一系列函数,用于响应玩家的输入,并更新角色的状态。例如,可以在Update函数中通过接收玩家输入的键盘或鼠标事件,实现角色的移动操作。另外,在FixedUpdate函数中可以使用角色控制器的Move函数进行碰撞检测和移动处理。 通过使用Unity官方提供的人物控制脚本,开发者可以方便地实现角色的基本操作,从而为游戏添加更丰富的交互性。同时,该脚本也提供了一些常用的功能和接口,如射线检测、跳跃力度控制等,方便开发者进一步扩展和定制角色的行为。 总之,Unity官方人物控制脚本是一种便捷的解决方案,用于实现角色的基本操作和行为。通过研究和使用这个脚本,开发者可以加快游戏开发速度,并为角色添加更多的交互性和动态性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值