Unity移动端第三人称控制器

这篇具有很好参考价值的文章主要介绍了Unity移动端第三人称控制器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.创建物体

unity第三人称控制器,Unity,unity,游戏引擎
在Hierarchy面板空白地方右键->3D Object创建一个Plane和一个Capsule

2.添加组件

unity第三人称控制器,Unity,unity,游戏引擎
鼠标单击选中Capsule
unity第三人称控制器,Unity,unity,游戏引擎
在右侧Inspector面板删除Capsule Collider碰撞体组件
unity第三人称控制器,Unity,unity,游戏引擎
添加一个Character Controller(角色控制器,自带一个碰撞体)和一个脚本ThirdPersonController(名字可以自己取)

3.编写代码

ThirdPersonController中定义变量:

public Transform cameraTransform,cameraPole;
public float moveSpeed,cameraSpeed;
public LayerMask cameraLayers;
CharacterController character;
float cameraPitch,maxDistance;
float leftId, rightId, halfWidth;
Vector2 startPos,lookInput,moveInput;

Start中初始化变量

void Start()
    {
        leftId = -1;
        rightId = -1;
        halfWidth = Screen.width / 2;

        character = GetComponent<CharacterController>();

        cameraPitch = cameraPole.localRotation.eulerAngles.x;
        maxDistance = cameraTransform.localPosition.z;
    }

创建一个函数 GetTouchInput

// 获取手指触摸的函数
void GetTouchInput()
    {
        //获取每一个手指的触摸信息
        foreach(Touch t in Input.touches)
        {
            switch (t.phase)
            {
                case TouchPhase.Began:
                    //点击接触
                    if (t.position.x < halfWidth && leftId == -1)
                    {
                        leftId = t.fingerId;
                        startPos = t.position;
                    }else if (t.position.x > halfWidth && rightId == -1)
                    {
                        rightId = t.fingerId;
                    }
                    break;
                case TouchPhase.Ended:
                    //手指离开
                case TouchPhase.Canceled:
                    //系统取消跟踪手指
                    if(t.fingerId == leftId)
                    {
                        leftId = -1;
                        //isMoveing = false;
                    }else if (t.fingerId == rightId)
                    {
                        rightId = -1;
                    }
                    break;
                case TouchPhase.Moved:
                    //手指移动
                    if (t.fingerId == leftId)
                    {
                        moveInput = t.position - startPos;
                    }else if (t.fingerId == rightId)
                    {
                        lookInput = t.deltaPosition * cameraSpeed * Time.deltaTime;
                    }
                    break;
                case TouchPhase.Stationary:
                    //手指静止
                    if(t.fingerId == rightId)
                    {
                        lookInput = Vector2.zero;
                    }
                    break;
            }
        }
    }

创建一个LookAround

void LookAround()
    {
        cameraPitch = Mathf.Clamp(cameraPitch - lookInput.y, -90f, 90f);
        cameraTransform.localRotation = Quaternion.Euler(cameraPitch, 0, 0);
        transform.Rotate(transform.up, lookInput.x);
    }

创建一个Move

void Move()
    {
        Vector2 moveDir = moveInput.normalized * moveSpeed*Time.deltaTime;
        character.Move(transform.right * moveDir.x + transform.forward * moveDir.y);
    }

创建一个MoveCamera

void MoveCamera()
    {
        Vector3 rayDir = cameraTransform.position - cameraPole.position;
        if(Physics.Raycast(cameraPole.position,rayDir,out RaycastHit hit, Mathf.Abs(maxDistance), cameraLayers))
        {
            cameraTransform.position = hit.point;
        }
        else
        {
            cameraTransform.localPosition = new Vector3(0, 1.2f, maxDistance);
        }
    }

在Update中调用 GetTouchInputLookAroundMoveMoveCamera

void Update()
    {
        GetTouchInput();
        if (leftId != -1)
        {
            Move();
        }
        if (rightId != -1)
        {
            LookAround();
        }
    }

在FixedUpdate中调用 MoveCamera

private void FixedUpdate()
    {
        MoveCamera();
    }

最后ThirdPersonController脚本代码如下:

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

public class ThirdPersonController : MonoBehaviour
{
    public Transform cameraTransform,cameraPole;
    public float moveSpeed,cameraSpeed;
    public LayerMask cameraLayers;

    CharacterController character;
    float cameraPitch,maxDistance;
    float leftId, rightId, halfWidth;
    Vector2 startPos,lookInput,moveInput;
    // Start is called before the first frame update
    void Start()
    {
        leftId = -1;
        rightId = -1;
        halfWidth = Screen.width / 2;

        character = GetComponent<CharacterController>();

        cameraPitch = cameraPole.localRotation.eulerAngles.x;
        maxDistance = cameraTransform.localPosition.z;
    }

    // Update is called once per frame
    void Update()
    {
        GetTouchInput();
        if (leftId != -1)
        {
            Move();
        }
        if (rightId != -1)
        {
            LookAround();
        }
    }

    private void FixedUpdate()
    {
        MoveCamera();
    }

    // 获取手指触摸的函数
    void GetTouchInput()
    {
        //获取每一个手指的触摸信息
        foreach(Touch t in Input.touches)
        {
            switch (t.phase)
            {
                case TouchPhase.Began:
                    //点击接触
                    if (t.position.x < halfWidth && leftId == -1)
                    {
                        leftId = t.fingerId;
                        startPos = t.position;
                    }else if (t.position.x > halfWidth && rightId == -1)
                    {
                        rightId = t.fingerId;
                    }
                    break;
                case TouchPhase.Ended:
                    //手指离开
                case TouchPhase.Canceled:
                    //系统取消跟踪手指
                    if(t.fingerId == leftId)
                    {
                        leftId = -1;
                        //isMoveing = false;
                    }else if (t.fingerId == rightId)
                    {
                        rightId = -1;
                    }
                    break;
                case TouchPhase.Moved:
                    //手指移动
                    if (t.fingerId == leftId)
                    {
                        moveInput = t.position - startPos;
                    }else if (t.fingerId == rightId)
                    {
                        lookInput = t.deltaPosition * cameraSpeed * Time.deltaTime;
                    }
                    break;
                case TouchPhase.Stationary:
                    //手指静止
                    if(t.fingerId == rightId)
                    {
                        lookInput = Vector2.zero;
                    }
                    break;
            }
        }
    }

    void LookAround()
    {
        cameraPitch = Mathf.Clamp(cameraPitch - lookInput.y, -90f, 90f);
        cameraTransform.localRotation = Quaternion.Euler(cameraPitch, 0, 0);
        transform.Rotate(transform.up, lookInput.x);
    }

    void Move()
    {
        Vector2 moveDir = moveInput.normalized * moveSpeed*Time.deltaTime;
        character.Move(transform.right * moveDir.x + transform.forward * moveDir.y);
    }

    void MoveCamera()
    {
        Vector3 rayDir = cameraTransform.position - cameraPole.position;
        if(Physics.Raycast(cameraPole.position,rayDir,out RaycastHit hit, Mathf.Abs(maxDistance), cameraLayers))
        {
            cameraTransform.position = hit.point;
        }
        else
        {
            cameraTransform.localPosition = new Vector3(0, 1.2f, maxDistance);
        }
    }
}

4.设置

unity第三人称控制器,Unity,unity,游戏引擎
在Capsule中创建一个空对象并改名为Camera Pole,Rotation的x设置为10
unity第三人称控制器,Unity,unity,游戏引擎

把相机放Camera Pole里,Position设置为(0,1.2,-5)
unity第三人称控制器,Unity,unity,游戏引擎
unity第三人称控制器,Unity,unity,游戏引擎
Capsule的ThirdPersonController设置为
unity第三人称控制器,Unity,unity,游戏引擎
现在可以编译成apk文件安装运行了!文章来源地址https://www.toymoban.com/news/detail-781148.html

到了这里,关于Unity移动端第三人称控制器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity如何实现第三人称相机跟随

    我们需要实现 简易 的, 泛用性高 的第三人称相机跟随,通过鼠标滚轮可以控制与对象物体的远近距离,按住鼠标右键拖动鼠标可以控制相机视角跟随物体旋转,并且相机始终朝向游戏对象。 1.在层级区域把主相机拖入玩家物体作为玩家的子层级,并且调整好适当的距离。

    2024年02月11日
    浏览(69)
  • Unity笔记:第三人称Starter Asset代码学习

    自己看了几篇文章和视频,写了个人物移动脚本,有很多瑕疵。这个时候研究一下优秀的代码总是好的,Unity官方有Third Person Starter Asset可供研究,其官方商店页面是:Starter Assets - ThirdPerson | Updates in new CharacterController package 官方B站介绍视频是:Bilibili - [Unity教程]-Starter Asset

    2024年02月22日
    浏览(60)
  • unity-第三人称摄像机简单脚本(包括跟随、视角旋转、滚轮缩放)

    本菜鸟为了实现第三人称视角摄像机的主要功能,踩了很多意料之外的坑,终于搞出一份自觉完美的脚本,分享一下。 功能:摄像机跟随、鼠标滚轮缩放视野、长按鼠标右键左右旋转视野、长按鼠标中键上下旋转视野。 此脚本挂接在摄像机上,有详细注释,可直接运行。

    2024年02月08日
    浏览(66)
  • 第三十章 Unity角色控制器 Character Controller

    在我们之前的章节中,我们已经了解了碰撞体和刚体。但是,对于刚体这个组件来讲,有两种使用方式。其一就是用它来模拟现实世界的移动或碰撞效果(例如,门的开关);其二就是使用代码来控制物体移动或碰撞(例如,角色的行走)。两种方式使用场景不同而已。 本章

    2024年02月08日
    浏览(57)
  • 【Unity游戏开发教程】零基础带你从小白到超神16——四种方法控制人物移动之角色控制器

    直接修改组件位置 去资源商城下载角色控制系统成品直接拿来用 unity提供的角色控制器组件 通过物理系统自己做

    2024年02月08日
    浏览(47)
  • 【unity小技巧】unity最完美的CharacterController 3d角色控制器,实现移动、跳跃、下蹲、奔跑、上下坡,复制粘贴即用

    其实一开始我是不打算写的,我感觉这种简单的功能,原以为网上随便一搜一大堆,但是我实际去搜发现网上很多都是 复制粘贴 ,要么 没有实操过 ,要么就是 功能不全 ,或者毫无解释的把代码丢出来,我自以为简单的3D角色控制,我整整花了3-4天才研究明白(虽然每天只

    2024年02月03日
    浏览(41)
  • ue4第三人称第一人称切换。

    1.默认第三人称。将远点的相机设置auto active为true。近点相机设置为false。   在做好的actor中设置camera的active,和人物是否隐藏。    通过v键来切换第一人称和第二人称。

    2024年02月12日
    浏览(54)
  • UE4第三人称多人联机游戏开发01

    单人游戏 中一台电脑只有一个游戏会话(Session),我们可以通过在同一电脑中分屏并用不同的输入设备,单人游戏不需要使用互联网。 多人游戏 中,游戏实例在独立的两台电脑中运行,而由于玩家在不断地输入指令,因此我们需要将一个游戏实例中的信息通过互联网传输到

    2024年02月07日
    浏览(90)
  • VR工地安全虚拟现实体验:多种事故模拟,第三人称回看

    建筑工地五大伤害是指:高处坠落、坍塌、物体打击、机械伤害、触电。利用VR(虚拟现实)技术体验建筑工地五大伤害,可以为建筑工人提供更真实、更安全的工作环境,同时也可以帮助他们更好地了解和掌握工作技能。 以下是 VR工地安全虚拟现实体验软件 的价值: 首先,通

    2024年02月12日
    浏览(49)
  • UE4/5 实现多相机模式切换(第一人称切第三人称等)

    对于多相机模式的切换,网上普遍使用SetViewTargetWithBlend这个节点,但这个节点很多相机参数不能设置,也不适合运用于游戏中多相机模式切换的场合。 UE中World Settings里的玩家控制器中,默认的控制器行为会对当前开启的Camera组件进行激活处理: 因此,默认绑在Pawn上的相机

    2024年02月11日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包