从零开始的原神桌宠

参考文章目录

1.【游戏开发实战】下载原神模型,PMX转FBX,导入到Unity中,卡通渲染,绑定人形动画(附Demo工程)
2.【Unity】如何编写鼠标拖拽移动物体
3.【unity】几种常用的拖拽方法(内置方法 + 接口 + Event Trigger组件)
4.【Unity】UGUI的EventSystem(事件系统)组件的介绍及使用
5.【Unity】鼠标控制3D物体的移动、旋转、缩放
6.【Unity】制作桌宠核心代码


前言


~首先非常感谢各位大佬们的分享,在他们的基础上我才能写出自己的桌宠程序。如有侵权,联系马上删改。
~其次我在他们教程的基础上进行了修改。下面是我制作的流程与他们的不同之处。


一、导入模型

首先根据第一篇文章下载安装好blender2.93版,我是从官网下载的,国内社区的没找到。
在使用cast修正模型fix model的时候,取消勾选Keep Upper Chest,不然模型脖子的骨架会发生折叠。
文章博主的Misc插件指的是杂项插件
MMD插件应该可以修正,但目前还没有弄明白如何使用该插件。
在这里插入图片描述

二、配置动画Animator

本人的设计的桌宠主要有两个动作,用鼠标动作进行动作切换。
Mixamo下载了动作之后,导入unity按照文章1的配置方式先设置好RigAnimation Type的模式
在这里插入图片描述
随后在导入的fbx中找到Animation拖入创建的Animator中,(Animator如果没生成,可以主动创建一个,添加到模型中即可)
在这里插入图片描述
在这里插入图片描述

这里我拉入了两个Animation并在Parameters中设置了一个bool变量chance来控制动作的切换在这里插入图片描述

三、鼠标事件控制(参考文章2-5)

1.设计鼠标单击切换桌宠动作功能

采用的是简单的鼠标按键的点击事件

代码如下:

using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
public class NewBehaviourScript : MonoBehaviour
{
 [SerializeField] Animator animator;//动作切换
 bool chance = false;
 void Update()
 {
     if (Input.GetMouseButton(0))
     {
         animator.SetBool("chance", chance);
         chance = !chance;
     }
  }
}

2.设计鼠标左键拖拽桌宠功能

  1. 这里有三种实现方式,一是利用Button触发拖动事件,模型跟随Button移动

代码如下:

using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UIElements;

public class DragObject : MonoBehaviour, IDragHandler
{
    public GameObject gameObject;
    public void OnDrag(PointerEventData eventData)
    {
        this.transform.position = eventData.position;
        gameObject.transform.position = new Vector3( eventData.position.x/1920*6-3, eventData.position.y/1080*3.4f-2f,0); 
    }
}

把脚本挂载到Button上,为了美观可以设置按钮图案的透明度为0
在这里插入图片描述

  1. 直接在模型上使用鼠标拖动事件

代码如下:

using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
public class NewBehaviourScript : MonoBehaviour
{
    Vector3 mouse_position;
    void OnMouseDrag()
    {
        mouse_position = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        transform.position = new Vector3(mouse_position.x, mouse_position.y - 1.25f, 0);        
    }
}

在模型上加载脚本即可

  1. 使用射线碰撞检测Raycast,这个功能模型必须添加Coliider组件,否则无法正常触发

代码如下:

using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;

public class NewBehaviourScript : MonoBehaviour
{
    public Camera game_camera;
    public Collider coll;
    Vector3 offset;
    Vector3 mouseStarPos;
    float depth;
    
    void Start()
    {
        coll = GetComponent<Collider>();
    }
    void Update()
    {
   
        Ray ray = game_camera.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;

        if (coll.Raycast(ray, out hit, 10.0f))
        {
            if (Input.GetMouseButtonDown(0))
            {

                depth = hit.distance;
                Vector3 mouseStartPos = ray.origin + ray.direction * depth;
                offset = transform.position - mouseStartPos;               
            }
            if (Input.GetMouseButton(0))
            {
                transform.position = ray.origin + ray.direction * depth + offset;
            } 
        }
    }   
}

这里的代码是文章2作者在评论区中给出的,但实际运行时如果鼠标拖动太快,程序帧数跟不上时容易出现拖不动的情况。

以上三种拖拽方法中模型坐标计算都略有区别,第一种是根据屏幕像素点大小转化过来的,程序中屏幕大小设置为1920*1080,归一化后乘以模型移动范围。第二种是直接利用内置坐标系变换函数。

3.设计鼠标右键旋转桌宠功能

把旋转的代码放入射线碰撞检测Raycast中即可

整合所有鼠标事件代码如下:

using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
[AddComponentMenu("Event/Event System")]


public class NewBehaviourScript : MonoBehaviour
{
    public Camera game_camera;
    [SerializeField] public Collider coll;
    Vector3 offset;
    float depth;  
    private float ySpeed = 120.0f; //旋转视角时相机y轴转速

    private int yMinLimit = -360;
    private int yMaxLimit = 360;

    private float x = 0.0f; //存储相机的euler角
    private float y = 0.0f; //存储相机的euler角

    [SerializeField] Animator animator;//动作切换
    
    bool chance = false;
    void Start()
    {
        coll = GetComponent<Collider>();
    }
    void Update()
    {
        if (Input.GetMouseButton(0))
        {
            animator.SetBool("chance", chance);
            chance = !chance;
        }    
        Ray ray = game_camera.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;
        if (coll.Raycast(ray, out hit, 10.0f))
        {
            if (Input.GetMouseButton(1))
            {               
                y -= Input.GetAxis("Mouse Y") * ySpeed*0.2f;
                y = ClampAngle(y, yMinLimit, yMaxLimit);
                transform.rotation= Quaternion.Euler(0, y+180, 0);
            }
        }
    }
    void OnMouseDrag()
    {
        mouse_position = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        transform.position = new Vector3(mouse_position.x, mouse_position.y - 1.25f, 0);
    }
    static float ClampAngle(float angle, float min, float max)
    {
        if (angle < -360)
            angle += 360;
        if (angle > 360)
            angle -= 360;
        return Mathf.Clamp(angle, min, max);
    }
}

四、桌面背景透明度设置

按照文章6进行设置

总结

实现了一个简单的原神桌宠,具有拖拽,旋转,动作切换功能。但目前实现功能较少,渲染结果会出现模型边缘锯齿的情况,计划下一步添加更多功能

一位在读的研究生,刚接触unity3D,希望大家一起学习,欢迎大家评论区留言。

  • 24
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Unity桌宠是一种相当有趣和创造性的项目。Unity是一款游戏引擎,可以帮助我们建立各种类型的游戏和应用程序,包括桌宠。 首先,我们可以使用Unity的精灵(Sprite)功能来创建一个可爱的桌宠角色。通过选择合适的图片,并将其导入Unity编辑器中,我们可以将这些图片放在屏幕上,并根据需要设置宠物角色的大小和位置。 接下来,我们可以使用Unity的动画功能来制作角色的动画。可以使用2D骨骼动画,或者使用帧动画来创建不同的动作,例如走路、跳跃、摆动等。我们还可以根据输入或者触控来触发不同的动画,使角色更加栩栩如生。 此外,我们还可以使用Unity的物理引擎来实现桌宠的互动。例如,我们可以设置角色可以被拖动、点击以及与其他物体交互。可以为宠物添加重力、碰撞器等物理属性,使得宠物在屏幕上的行为更具真实感。 另外,我们还可以使用Unity的声音系统,为桌宠添加音效和语音对话。可以通过录制和导入相应的音频文件,然后在角色和交互动作时播放不同的声音,从而增加与用户的互动性。 最后,我们可以使用Unity的用户界面(UI)功能来添加一些额外的功能,例如显示时间、天气、或者与用户互动的按钮。通过UI功能,我们可以为用户提供更多的选择,让用户在桌面上的时间更加有趣且多样化。 综上所述,使用Unity来制作桌宠是一个有趣且创造性的项目。通过使用Unity的精灵、动画、物理引擎、声音系统和用户界面功能,我们可以创建一个可爱和互动性强的桌宠,为使用者带来乐趣和娱乐。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦的自画相

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值