While I appreciate what you want to do, you need a serious reality check.
You are likely to find time for 500 or 1000 hours of effort to your project. The normal scale for comparing work is FTE ("Full Time Equivalent"), which is about 40 hours of week for a full year. You are most likely going to spend 0.25 FTE on your project, maybe even as high as 0.5 FTE if you work on it extensively but few students invest that kind of time on projects.
The projects you list as comparable are not small. They have development teams from tens of people to hundreds of people and required multiple years. They are on the scale of hundreds or thousands of FTE hours.
You have about 0.25 FTE available for your project. If you expect the same results as a 2000 FTE project, success is unlikely.
Sorry for a quick OT:
Funnies aside, I have a smallish engine I've been working on. For 7-8 years now. It started out aimless like most beginner projects and while there have been (literally) countless times when I've gotten sidetracked, the learning curve related to relevant topics has still amounted to well into thousands of hours of time that I've spent reading, planning, writing code, fixing mistakes, replanning and rewriting code.
I would hope that if I started from scratch now, I could accomplish something tangible in a year and a half, but this owes a lot to the experience I've accumulated over these 8 years. There are innumerable things I would do differently that would allow me to avoid rewriting large portions of code many times, simply because I've run into unforeseeable complications down the line. If I had ever worked on an actual professional game, I could likely have avoided a lot of dabbling in voodoo and cleaning up after misplaced assumptions. But I didn't have that privilege and I've paid for it with time.
That being said, I wholeheartedly support the idea of working on your own engine. I personally love it, because once you nail something down, it's positively awesomely rewarding in the bestest possible way. And more importantly, it's yours.
Just be sure to have a goal (an actual game you want to finish) and start with something small. Start with a fully modular implementation of Pong. Treat it like a miniature open world top-down 3D FPS with a fixed camera, two walls, three dynamic actors and no guns. From personal experience - once I realized that if I wanted to do everything the way it would be done in a modern engine, I found myself diving headlong into collision response between fast-moving dynamic bodies. This alone sent me straight back to square one. GJK, SAT, Minkowski space, etc. It was a can of worms I never even knew existed. Yet in the grand scheme of things it was but one of many many roadblocks that tackled me while I though it would be the other way around. The truth is, everyone gets suckered into game development thinking it's the other way around.
The thought I want to convey with the above example is that writing an engine per se is not a very good idea. But if you put together a framework that can run Pong from a couple of pages of Lua script attached to your main engine, you'll find that you can suddenly do so much more with it.
At first, thank you very much for your supports to me. Combine with other opinions, which I found them very reasonable, I will focus on finishing the API, as the first and must-be-done target.
My problem is, I'm inexperience, and two engines that I want to use as references - Unity and Unreal Engine - are very large. The base system - Ogre3D - is not small at all. Some features of these engines I've never listened or used (such as light probes in Unity, I don't even know what on earth is this). Since I have started working at a small game studio, I just focus on the game contents, that means I have a very foggy knowledge about what are happening in the low-level of the engine.
I think I have two choices, can you give me your advices?
1. Concentrate on what I know, and finish the API based on these things. Then make a demo, and add missing features while making that demo.
2. Build the low-level knowledge first, after that, start writing the full API - I will face some troubles such as I will forget what I've read lol.